的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
如何可以用来解决同样的问题实验,在这种情况下,我只是遍历所有项目,并手动进行了正则表达式过滤。