我正在尝试查看libxml如何实现XPath支持,因此使用xmllint测试是有意义的。然而,明显的选项--pattern,有点模糊,我最终使用了类似的东西:
test.xml: <foo><bar/><bar/></foo>
> xmllint --shell test.xml
/ > dir /foo
ELEMENT foo
/ > dir /foo/*
ELEMENT bar
ELEMENT bar
这似乎有效,而且很棒,但我仍然很好奇。 什么是xmllint的--pattern选项,以及它是如何工作的?
提供完整信用的示例。 =)
答案 0 :(得分:20)
看似无证的选项--xpath似乎更有用。
% cat data.xml
<project>
<name>
bob
</name>
<version>
1.1.1
</version>
</project>
% xmllint --xpath '/project/version/text()' data.xml | xargs -i echo -n "{}"
1.1.1
% xmllint --xpath '/project/name/text()' data.xml | xargs -i echo -n "{}"
bob
答案 1 :(得分:7)
提示的单词“可以与解析器的阅读器接口一起使用”:xmllint在传递--stream选项时仅使用阅读器界面:
$ xmllint --stream --pattern /foo/bar test.xml
Node /foo/bar[1] matches pattern /foo/bar
Node /foo/bar matches pattern /foo/bar
答案 2 :(得分:3)
从xmllint(1)手册页:
--pattern PATTERNVALUE
Used to exercise the pattern recognition engine, which can be
used with the reader interface to the parser. It allows to
select some nodes in the document based on an XPath (subset)
expression. Used for debugging.
它只能理解XPath的一个子集,它的目的是帮助调试。完全理解XPath的库是libxslt(3)及其命令行工具xsltproc(1)。
libxml中的``pattern''模块“允许在树中或基于解析器状态编译和测试节点的模式表达式”,其文档存在于此处:http://xmlsoft.org/html/libxml-pattern.html
阿里。
答案 3 :(得分:3)
如果您只想要多个xml节点的文本值,那么您可以使用类似这样的内容(如果您的xmllint版本中没有--xpath):
./foo.xml:
<hello>
<world>its alive!!</world>
<world>and works!!</world>
</hello>
$ xmllint --stream --pattern /hello/world --debug ./foo.xml | grep -A 1 "matches pattern" | grep "#text" | sed 's/.* [0-9] //'
its alive!!
and works!!