web-dev-qa-db-ja.com

XPATHを使用したLinux Bash XMLLINT

今日は、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行で助けてもらえますか?

11
RootWannaBe

特定のターゲットを設定し、その子要素にドリルダウンする最良の方法

これを行うための正しい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
15
Mathias Müller

私のお気に入りは xmlstarlet です。これは xmllint よりも強力だと思われるためです。

xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
1
typelogic

数分前に同じ問題が発生し、この投稿を見ました。

少しハッキングした後、街を抽出するための次の解決策を見つけました。

(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タグを取得し、ノード値のみを返す必要があります。

0
Andreas Cordes