我有一个需要从shell解析的XML文件。看起来有点像这样:
<?xml version="1.0" encoding="UTF-8"?>
<things>
<thing>
<foo>123</foo>
<bar>false</bar>
</thing>
<thing>
<bar>true</bar>
<foo>abc</foo>
</thing>
</things>
请注意thing
s的子节点的顺序是任意的。在我的真实数据中,每个thing
内都有一些其他子节点。
现在,foo
的值是唯一的。我需要获取其子bar
的值为thing
的{{1}}子节点foo
的值,例如abc
。我尝试使用xmllint
的XPath查询,但没有运气。我无法得到一场比赛;或者,如果我只是使用更一般的查询进行测试,我会得到整个树。
$ xmllint --pattern //thing[foo='abc']/bar test.xml
xmllint: No match.
$ xmllint --pattern //thing/bar test.xml
(the whole tree)
我希望得到true
。
我做错了什么?我没有其他问题可以访问--xpath
标志,所以如果这是答案,那么我运气不好。
答案 0 :(得分:4)
尝试此命令:
xmllint --xpath '//thing[foo="abc"]/bar/text()' test.xml
另一个命令:
echo 'cat //thing[foo="abc"]/bar/text()' | xmllint --shell test.xml
同时尝试xmlstarlet
:
xmlstarlet sel -t -m '//thing[foo="abc"]/bar' -v 'text()' test.xml