Добавление строки в XML-файл после определенных тегов

Добавление строки в XML-файл после определенных тегов

Как бы вы, ребята, добавили строку в кучу 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

Вот вам решение с использованием xmlstarletXPath. Я расширил 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>

Связанный контент