的XPath的libxml可以是正则表达式类型

问题描述:

我们平时写我们的搜索路径在findnodes()功能如下的XPath的libxml可以是正则表达式类型

//parentNode[subNode/text() = 'CPUUSAGE']/subNode 

是什么我想在这里匹配文本的一部分,并找到所有的节点?

//parentNode[subNode/text() =~ '/CPUUSAGE'/]/subNode 

显然,这是无效的XPATH ...

任何思考如何实现这一目标?

我知道我可以先找到节点,然后尝试匹配textContent。但是我们可以直接在findnodes()中一次完成吗?

XPath 1.0(其中libxml实现)不包含对正则表达式的任何内置支持。在使用一个相当简单的正则表达式你给的例子,你可以使用contains function来实现类似的结果:

//parentNode[subNode[contains(text(), 'CPUUSAGE')]]/subNode 

(顺便说一句这是一个奇怪的表情 - 你可能真的要像//parentNode/subNode[contains(text(), 'CPUUSAGE')]但我意识到这仅仅是一个例子。)

还有一些其他string functions可以用于创建其他简单的查询。

您可以创建自己的自定义XPath函数来基于正则表达式过滤节点,实际上Perl Perl LibXML模块的文档包含example of doing just that

XPath 2.0确实支持使用正则表达式与group of string functions。除非你有一个不会太有用的XPath 2.0处理器。

XML::Twig在xpaths中支持正则表达式。

下面是我在回答中使用这太问题的XPath:Updating xml attribute value based on other with Perl

project[string(path) =~ /\bopensource\b/]/revision 

我还创建了第二个答案,这样我可以用XML::LibXML如何可以用来解决同样的问题实验,在这种情况下,我只是遍历所有项目,并手动进行了正则表达式过滤。