最初の属性が一致すると、xmllint は 2 番目の属性の値を表示します。

最初の属性が一致すると、xmllint は 2 番目の属性の値を表示します。

私の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

  1. 形式xmlが正しくありません。 label list1のデータが早く終了しました。</list1>最後にする必要があります。
  2. @eyoung100が提案したようにxmllint
  3. 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)}'"

これはあなたがしたいことですか?

関連情報