结合命名空间和 node() 时,Nokogiri 中有关 XPath 的语法错误

Syntax error about XPath in Nokogiri, when combining namespace and node()

我正在使用 Nokogiri 学习 XPath。 XPath 是这样的:

xml_doc = Nokogiri::XML(open("test.xml"))
result = xml_doc.xpath("//x:foo", 'x' => 'www.example.com')

我可以得到结果。但是当我执行此调用时:

result = xml_doc.xpath("//x:node()", 'x' => 'www.example.com')

我收到一个错误:

Nokogiri::XML::XPath::SyntaxError: Invalid expression: //x:node()

我是不是做错了什么?

与元素不同,你不需要使用命名空间前缀来匹配node()。以下将 return 任何名称空间中的所有节点都很好:

result = xml_doc.xpath("//node()")

XPath中有几种类型的节点,分别是文本节点、注释节点、元素节点等等。 node() 是一个节点测试,它对任何节点类型都简单地 returns 为真。与 text() 相比,后者是另一种类型的节点测试,return 仅适用于文本节点。 (参见“w3.org > Xpath > Node Tests”)

据我所知,本地名称和命名空间的概念仅存在于 element 节点的上下文中,因此在 node() 测试中使用命名空间前缀根本没有意义。

如果您打算 select 特定命名空间中的所有 元素 使用 * 而不是 node():

result = xml_doc.xpath("//x:*", 'x' => 'www.example.com')