web-dev-qa-db-ja.com

xmllintが1回の実行で複数の属性の値を表示する

私はxmllintを使用して、いくつかのタグがあり、各タグにいくつかの属性があるxmlファイルを解析しています。以下に示すサンプル構造:

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>

属性から値をフェッチする必要がありますattr1attr2およびattr3

これまでのところ、1つの属性のデータを完全に与える次のことを試しました

echo 'cat //root/child/@attr1' | xmllint --Shell data.xml 

この出力

attr1="abc"

したがって、私の質問は、文字列に複数の属性を指定して、必要な出力を次のように取得するにはどうすればよいですか?

attr1="abc"
attr2="def"
attr3="ghi"

私はこれについて以下を試しましたが、良い結果はありませんでした:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --Shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --Shell data.xml 

上記の出力では、echoステートメントが再度エコーされました。つまり、xmllintはそれを入力として受け入れませんでした。

これにどう取り組むかについてのアイデアはありますか?

5
mtk

私の知る限り|セパレータはパス全体でのみ使用できます:

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --Shell data.xml

(なので //は、どの深さでも、「// root」はパーサーに無意味な追加作業を行わせることを意味します。サンプルXMLの外観が実際のものと似ていると仮定すると(ルートは実際にはXMLのルートノードです)、「/ root/child」を使用することをお勧めします。)

または、XPath関数で式を使用できます。

echo 'cat /root/child/@*[name()="attr1" or name()="attr2" or name()="attr3"]' | xmllint --Shell data.xml

「attr *」という名前のすべての属性が必要な場合は、総称式を使用できます。

echo 'cat /root/child/@*[starts-with(name(),"attr")]' | xmllint --Shell data.xml
6
manatwork