结合命名空间和 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')
我正在使用 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')