15

我正在尝试了解 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 选项,它是如何工作的?

提供一个完整的例子。=)

4

4 回答 4

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
于 2011-03-10T14:28:55.920 回答
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
于 2012-05-02T19:24:17.170 回答
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 中的“模式”模块“允许编译和测试树中或基于解析器状态的节点的模式表达式”,其文档位于:http: //xmlsoft.org/html/libxml-pattern。 html

阿里。

于 2010-02-12T22:57:43.333 回答
3

如果您只是想要多个 xml 节点的文本值,那么您可以使用类似这样的东西(如果 --xpath 在您的 xmllint 版本上不可用):

./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!!
于 2013-07-22T15:28:57.243 回答