特定のタグの後に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

これが XPath を使用したソリューションですxmlstarlet。特定のノードを選択できることを示すために 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要素もあるの新しいサブノードを作成します。この新しいノードを XPath 変数に割り当てて、簡単に参照できるようにします。最後に、2 つの属性を挿入します。NameMappernap

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>

関連情報