如果第一个属性匹配,则 xmllint 显示第二个属性的值

如果第一个属性匹配,则 xmllint 显示第二个属性的值

我的 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格式不正确。标签 list1 中的数据提前结束。应该</list1>在最后。
  2. 正如 @eyoung100 建议的那样,请升级您的xmllint.
  3. echo 'cat //list1/list2[@id="abc"]/@value' | xmllint --shell myxml | awk -F'[="]' '!/>/{print $(NF-1)}'xml如果您更正第 1 点中提到的内容并确保该文件位于当前工作目录中(或使用绝对路径),那么它将起作用myxml,尽管这不是正确的做法。

代码:

myvar='abc'
myxml='myxml'
myvalue="cat //list1/list2[@id=\"'$myvar'\"]/@value | xmllint --shell $myxml"
sh -c "echo $myvalue | gawk -F'[=\"]' '!/>/{print \$(NF-1)}'"

这就是你想做的吗?

相关内容