コマンドライン上での XML 文書の編集

ちょっとした XML の編集

どうやら XMLStarlet が良いらしい。

sed で引っ掛けようとしてもタグの重複なんて沢山あるし…

データの置換(update)

削除、挿入、追記…と一般的な操作は網羅しているようだけれど、今回欲しかったのは置換(update? replace?)の操作だったのでその説明。

XPath で場所を指定して値をセットすれば終了!

$ xmlstarlet ed -u "[XPath]" -v [置換する値] [ファイル名]

実行例

以下の様な XML を例として説明。

<!-- hoge.xml -->
<xml>
  <table>
    <elm id="0">
      <number>000</number>
      <name>Rocking Horse Fly</name>
    </elm>
    <elm id="1">
      <number>111</number>
      <name>Snap-Dragonfly</name>
    </elm>
  </table>
</xml>

属性値の置換例

コマンド

$ xmlstarlet ed -u "/xml/table/elm[@id=1]/@id" -v 2 hoge.xml

結果

<!-- hoge.xml -->
<xml>
  <table>
    <elm id="0">
      <number>000</number>
      <name>Rocking Horse Fly</name>
    </elm>
    <!-- 1 -> 2 -->
    <elm id="2">
      <number>111</number>
      <name>Snap-Dragonfly</name>
    </elm>
  </table>
</xml>

要素の内容の置換例

コマンド

xmlstarlet ed -u "/xml/table/elm[@id=1]/name" -v "Bread and Butterfly" hoge.xml

結果

<!-- hoge.xml -->
<xml>
  <table>
    <elm id="0">
      <number>000</number>
      <name>Rocking Horse Fly</name>
    </elm>
    <elm id="1">
      <number>111</number>
      <!--  Snap-Dragonfly -> Bread and Butterfly -->
      <name>Bread and Butterfly</name>
    </elm>
  </table>
</xml>