xmlstarlet を使ってコマンドライン上で XPath を使ったselectやupdateが可能になる

インストール

Macの場合 Homebrew

brew install xmlstarlet

使い方

以下のようなxmlを考える

<contracts>
    <clients>
        <client ref="123">
            <name>Nicol</name>
        </client>
        <client ref="8234">
            <name>Basil</name>
        </client>
    </clients>
    <entries>
        <entry ref="63352">
            <regCode>BCG</regCode>
        </entry>
        <entry ref="3242">
            <regCode>TYD</regCode>
        </entry>
    </entries>
</contracts>  

参照

$ xmlstarlet sel -t -c '//client[@ref="123"]' -t -c '/contracts/entries/entry' temp.xml
<client ref="123">
            <name>Nicol</name>
        </client><entry ref="63352">
            <regCode>BCG</regCode>
        </entry><entry ref="3242">
            <regCode>TYD</regCode>
        </entry>

更新

値の更新

inplace でファイルを書き換える

$ xmlstarlet ed --inplace -u '/contracts/clients/client[@ref="123"]/name' -v Jack temp.xml

結果

<contracts>
  <clients>
    <client ref="123">
      <name>Jack</name>
    </client>
    <client ref="8234">
      <name>Basil</name>
    </client>
  </clients>
  <entries>
    <entry ref="63352">
      <regCode>BCG</regCode>
    </entry>
    <entry ref="3242">
      <regCode>TYD</regCode>
    </entry>
  </entries>
</contracts>

attributeの更新

$ xmlstarlet ed -u '//entry[@ref="3242"]/@ref' -v 99 temp.xml
<?xml version="1.0"?>
<contracts>
  <clients>
    <client ref="123">
      <name>Jack</name>
    </client>
    <client ref="8234">
      <name>Basil</name>
    </client>
  </clients>
  <entries>
    <entry ref="63352">
      <regCode>BCG</regCode>
    </entry>
    <entry ref="99">
      <regCode>TYD</regCode>
    </entry>
  </entries>
</contracts>

削除

$ xmlstarlet ed -d '//entry[@ref="3242"]' temp.xml
<?xml version="1.0"?>
<contracts>
  <clients>
    <client ref="123">
      <name>Jack</name>
    </client>
    <client ref="8234">
      <name>Basil</name>
    </client>
  </clients>
  <entries>
    <entry ref="63352">
      <regCode>BCG</regCode>
    </entry>
  </entries>
</contracts>