Как бы вы, ребята, добавили строку в кучу XML-файлов после определенных тегов? Решение может быть основано на использовании инструментов unix или назовите текстовый редактор или утилиту, которая позволит мне сделать это быстро и легко. У меня более 60 файлов, которые мне нужно отредактировать.
Например, у меня есть следующий XML:
<Node disablePersistence="true">
<Name>Mapper</Name>
<Action>
<Class-Name>com.test.component.Mapper</Class-Name>
<Param name="output_url" value="constant:file:///output.xml"/>
<Param name="xml_url" value="constant:file:///input.xml"/>
<Param name="xsl_url" value="constant:file:///template.xsl"/>
</Action>
<Next-Node>ComposeMessage</Next-Node>
</Node>
Сначала мне нужно будет найти тег Node. Затем мне нужно будет найти тег Name = Mapper. Затем нужно будет найти тег Action. Затем нужно будет найти тег Param. Там, где находятся все теги для Param, нам нужно вставить новую строку:
<Param name="new_parameter" value="constant:true"/>
Возможно ли это или это слишком много и будет быстрее вручную отредактировать все файлы?
решение1
Вот вам решение с использованием xmlstarlet
XPath. Я расширил XML, чтобы продемонстрировать, что мы можем выбирать определенные узлы:
Решение
xmlstarlet edit \
--subnode '//Node[Name/text()="Mapper"]/Action' --type elem --name 'Param' \
--var nap '$prev' \
--insert '$nap' --type attr --name 'name' --value 'new_parameter' \
--insert '$nap' --type attr --name 'constant:true'
Мы создаем новый подузел, Node/Action
где также есть элемент Name
, имеющий текстовое значение Mapper
. Мы назначаем этот новый узел переменной XPath nap
, чтобы мы могли легко ссылаться на него. Наконец, мы вставляем в него два атрибута.
Пример XML-файла
<root>
<Node disablePersistence="true">
<Name>Mapper</Name>
<Action>
<Class-Name>com.test.component.Mapper</Class-Name>
<Param name="output_url" value="constant:file:///output.xml"/>
<Param name="xml_url" value="constant:file:///input.xml"/>
<Param name="xsl_url" value="constant:file:///template.xsl"/>
</Action>
<Next-Node>ComposeMessage</Next-Node>
</Node>
<Node disablePersistence="true">
<Name>DoNotTouchMe</Name>
<Action>
<Class-Name>com.test.component.Mapper</Class-Name>
<Param name="output_url" value="constant:file:///output.xml"/>
<Param name="xml_url" value="constant:file:///input.xml"/>
<Param name="xsl_url" value="constant:file:///template.xsl"/>
</Action>
<Next-Node>ComposeMessage</Next-Node>
</Node>
</root>
Результат
<root>
<Node disablePersistence="true">
<Name>Mapper</Name>
<Action>
<Class-Name>com.test.component.Mapper</Class-Name>
<Param name="output_url" value="constant:file:///output.xml"/>
<Param name="xml_url" value="constant:file:///input.xml"/>
<Param name="xsl_url" value="constant:file:///template.xsl"/>
<Param name="new_parameter" constant:true=""/>
</Action>
<Next-Node>ComposeMessage</Next-Node>
</Node>
<Node disablePersistence="true">
<Name>DoNotTouchMe</Name>
<Action>
<Class-Name>com.test.component.Mapper</Class-Name>
<Param name="output_url" value="constant:file:///output.xml"/>
<Param name="xml_url" value="constant:file:///input.xml"/>
<Param name="xsl_url" value="constant:file:///template.xsl"/>
</Action>
<Next-Node>ComposeMessage</Next-Node>
</Node>
</root>