特定のタグの後に、多数の 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 つの属性を挿入します。Name
Mapper
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>