组合命名空间和node()时Nokogiri中关于XPath的语法错误

时间:2015-03-22 05:40:59

标签: ruby xpath nokogiri

我正在和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()

我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

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

XPath中有几种类型的节点,即文本节点,注释节点,元素节点等。 node()是一个节点测试,它只是为任何节点类型返回true。与text()比较,node()是另一种类型的节点测试,仅对文本节点返回true。 (参见“w3.org > Xpath > Node Tests”)

根据我的理解,本地名称和命名空间的概念仅存在于元素节点的上下文中,因此使用命名空间前缀和*测试根本不会感。

如果您打算在特定命名空间中选择所有元素,请使用node()代替result = xml_doc.xpath("//x:*", 'x' => 'www.example.com')

{{1}}