私はxmllintを使用して、いくつかのタグがあり、各タグにいくつかの属性があるxmlファイルを解析しています。以下に示すサンプル構造:
<root>
<child attr1="abc" attr2="def" attr3="ghi" />
...
...
</root>
属性から値をフェッチする必要がありますattr1
、attr2
および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はそれを入力として受け入れませんでした。
これにどう取り組むかについてのアイデアはありますか?
私の知る限り|
セパレータはパス全体でのみ使用できます:
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