我的 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
格式不正确。标签 list1 中的数据提前结束。应该</list1>
在最后。 - 正如 @eyoung100 建议的那样,请升级您的
xmllint
. 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)}'"
这就是你想做的吗?