xmllint は、1 つの実行で複数の属性値を表示します。

xmllint は、1 つの実行で複数の属性値を表示します。

私はxmllintを使って、それぞれが異なる属性を持つ複数のタグを持つxmlファイルを解析しています。構造例は次のとおりです。

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

attr1attr2属性から値を取得する必要があります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

速くて汚い…

関連情報