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>