我正在和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()
我做错了吗?
答案 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}}