こんにちは。itouです。
ShellScript(シェルスクリプト)でXMLをパースして内容を取り出すTIPSです。
環境はLinux(CentOS6.5)で検証します。
ツールは「xmllint」を使用します。
CentOS6.5だと「/usr/bin/xmllint」にプリインストールされています。
xmllintの本家サイトは「http://xmlsoft.org/」です。
まず、サンプルのXMLファイルを作成します。
・sample.xml
[code] <?xml version="1.0" encoding="UTF-8"?> <sample> <food> <name language="Japanese">りんご</name> <amount>105</amount> </food> <food> <name language="English">grape</name> <amount>210</amount> </food> </sample> [/code]
xmllintでサンプルXMLファイルを参照します。
“cat”でXMLの全内容を取得できます
[shell] $ xmllint --shell sample.xml / > cat <?xml version="1.0" encoding="UTF-8"?> <sample> <food> <name language="Japanese">りんご</name> <amount>105</amount> </food> <food> <name language="English">grape</name> <amount>210</amount> </food> </sample> [/shell]
「sample」→「food」→「name」要素の内容を取得する場合は、下記のように指定します。
[shell] / > cat /sample/food/name ------- <name language="Japanese">りんご</name> ------- <name language="English">grape</name> [/shell]
2番目の「food」要素に定義している「name」要素の内容を取得する場合は、下記のように指定します。
[shell] / > cat /sample/food[2]/name <name language="English">grape</name> [/shell]
「language」属性の内容を取得する場合は、下記のように指定します。
[shell] / > cat /sample/food/name/@language ------- language="Japanese" ------- language="English" [/shell]
ShellScriptで取得する場合など、非対話で実施する場合は、下記のようにします。
[shell] $ echo "cat /sample/food/name" | xmllint --shell sample.xml / > ------- <name language="Japanese">りんご</name> ------- <name language="English">grape</name> [/shell]
各項目をxmllintにて取得し整形して表示するshellを作成しました。
xmllintによりXML要素の内容を取得し、sedで整形しています。
・sample.sh
[shell] #!/bin/sh count=1 while : do # 食べ物の名称を取得 name_xml=`echo "cat /sample/food[${count}]/name" | xmllint --shell sample.xml` # 食べ物の名称の言語を取得 language_xml=`echo "cat /sample/food[${count}]/name/@language" | xmllint --shell sample.xml` # 食べ物の金額を取得 amount_xml=`echo "cat /sample/food[${count}]/amount" | xmllint --shell sample.xml` # 全て取得した場合、ループを抜ける if [ "${name_xml}" = "/ > / > " ]; then break fi # 取得内容を整形 language=`echo ${language_xml} | sed -e "s/^.*language=\"\(.*\)\".*$/\1/"` name=`echo ${name_xml} | sed -e "s/^.*<name.*>\(.*\)<\/name>.*$/\1/"` amount=`echo ${amount_xml} | sed -e "s/^.*<amount.*>\(.*\)<\/amount>.*$/\1/"` # 取得結果を表示 echo ${name}"("${language}")"の金額は"${amount}円" count=${count}+1 done [/shell]
実行結果です
[code] りんご(Japanese)の金額は105円 grape(English)の金額は210円 [/code]
ShellScriptでXMLの内容を取得したい場合
xmllintは選択肢の一つになると思います。