私のXMLは次のとおりです
<list1>
<list2 id="abc" value="yes"></list2>
<list2 id="xyz" value="no"></list2>
<list2 id="def" value="yes"></list2>
<list1>
使用xmllint
しかし、正しい出力を得ることはできません。 「abc」を提供する上記のxmlを照会すると、「yes」を返す必要があります。
答え1
XPathstring()
関数を使用して属性値のみを取得できますvalue
。
$ xmllint --xpath 'string(//list1/list2[@id="abc"]/@value)' data.xml
yes
一般的な構文を使用して変数としてキャプチャできますbash
。
value=$(
xmllint --xpath \
'string(//list1/list2[@id="abc"]/@value)' data.xml
)
それから:
echo $value
結果:
yes
答え2
- 形式
xml
が正しくありません。 label list1のデータが早く終了しました。</list1>
最後にする必要があります。 - @eyoung100が提案したように
xmllint
。 echo 'cat //list1/list2[@id="abc"]/@value' | xmllint --shell myxml | awk -F'[="]' '!/>/{print $(NF-1)}'
xml
最初のトピックで説明した内容を変更し、ファイルが現在の作業ディレクトリにあるかどうかを確認するか、絶対パスを使用すると正しく機能しますが、myxml
これは正しいアプローチではありません。
パスワード:
myvar='abc'
myxml='myxml'
myvalue="cat //list1/list2[@id=\"'$myvar'\"]/@value | xmllint --shell $myxml"
sh -c "echo $myvalue | gawk -F'[=\"]' '!/>/{print \$(NF-1)}'"
これはあなたがしたいことですか?