今日は、xmllintを適切に使用する方法を学びます。十分にカバーまたは説明されていないようです。単一の言語リソースファイルを使用してシステム全体を実行する予定です。この言語ファイルから読み取る必要があるbashスクリプトとphpページが混在しています。
現在、xmlファイルen.xmlで次の形式を使用しています。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item id="index.php">
<label>LABEL</label>
<value>VALUE</value>
<description>DESCRIPTION</description>
</item>
<item id="config.php">
<label>LABEL</label>
<value>VALUE</value>
<description>DESCRIPTION</description>
</item>
</resources>
ここで、xmlファイルからデータ値を取得するbashスクリプト行から開始する必要があります。たとえば、index.php
アイテムからDESCRIPTION
の値を取得したい。
私が使っていた
xmllint --xpath 'string(//description)' /path/en.xml
別のレイアウトで機能していましたが、現在xmlファイルのレイアウトを変更しているため、特定の<item>
をターゲットにし、bashスクリプトでその子要素にドリルダウンする最善の方法が失われています。
誰かがこの値を取得するためにxmllint --xpath
行で助けてもらえますか?
特定のターゲットを設定し、その子要素にドリルダウンする最良の方法
これを行うための正しいXPath式は次のとおりです。
/resources/item[@id="index.php"]/description/text()
簡単な英語:ドキュメントノードから開始し、ドキュメント要素resources
から、その子item
へ。ただし、id
属性の値が「インデックス」の場合のみ。 php "、その子description
でテキスト値を取得します。
Xmllintを使用してXMLドキュメントを検証しますが、パス式には使用しません。 bashシェル(少なくともMac OSの場合)には、「xpath」と呼ばれる、XPath式を評価するためのさらに簡単なツールがあります。
$ xpath en.xml '/resources/item[@id="index.php"]/description/text()'
次に、次の結果が得られます。
Found 1 nodes:
-- NODE --
DESCRIPTION
それでもxmllintを使用する場合は、次の方法で使用してください。
$ xmllint --xpath '/resources/item[@id="index.php"]/description/text()' en.xml > result.txt
デフォルトでは、--xpath
は--noout
を意味し、xmllintが何も出力しないようにします。出力をファイルにリダイレクトします。
$ cat result.txt
DESCRIPTION
私のお気に入りは xmlstarlet です。これは xmllint よりも強力だと思われるためです。
xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
数分前に同じ問題が発生し、この投稿を見ました。
少しハッキングした後、街を抽出するための次の解決策を見つけました。
(wget 'http://maps.googleapis.com/maps/api/geocode/xml?latlng=53.244921,-2.479539&sensor=true' -O dummy.xml -o /dev/null;xmllint --format --xpath '/GeocodeResponse/result[type = "postal_town"]/address_component[type = "postal_town"]/short_name/node()' dummy.xml)
正しいX-Pathを指定して目的のXMLタグを取得し、ノード値のみを返す必要があります。