私はxmllintを使って、それぞれが異なる属性を持つ複数のタグを持つxmlファイルを解析しています。構造例は次のとおりです。
<root>
<child attr1="abc" attr2="def" attr3="ghi" />
...
...
</root>
attr1
attr2
属性から値を取得する必要がありますattr3
。
これまで私は、プロパティデータを完全に提供するために次のことを試しました。
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がこれを入力として受け入れないことを意味します。
この問題を解決する方法についてのアイデアはありますか?
答え1
私が知っている限り、|
区切り文字はフルパスでのみ使用できます。
echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --shell data.xml
(//
意味の深さにかかわらず、 "/ / root"はパーサーに無意味な追加操作を実行させます。例XMLが実際の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
答え2
grep -o attr[0-9]...... file.ext
速くて汚い…