我有一个Nokogiri节点,我正在做一个xpath查询,应该返回一个NodeSet。相反,它返回一个字符串。我检查了xml源代码,发现数据只包含一个元素而不是很多元素。
它不应该返回只有一个值而不是String的NodeSet吗?我该如何处理?
这是伪 xml,它正确返回一个包含2个条目的NodeSet:
<root>
<products>
<product>
<productID>1</productID>
</product>
<product>
<productID>2</productID>
</product>
</product>
</root>
这是伪 xpath查询:
//root/products/product
如果xml只包含一个产品,我会得到一个String而不是一个带有1个条目的NodeSet
<root>
<products>
<product>
<productID>1</productID>
</product>
</product>
</root>
更新2012年12月12日:我仍然认为这是Nokogiri的一个错误。上面的伪xml不会重现这个条件,但是我有几个来自客户端的xml示例,它们会重现问题。我可能会发布一个混淆版的xml。无论如何,我已将代码更改为使用XmlSimple而不是Nokogiri。
答案 0 :(得分:1)
适合我:
require 'nokogiri'
xml = "<root><products>
<product><productID>1</productID></products>
</product></root>"
p Nokogiri.XML(xml).xpath('//root/products/product').class,
#=> Nokogiri::XML::NodeSet
Nokogiri::VERSION,
#=> "1.5.2"
RUBY_DESCRIPTION
#=> "ruby 1.9.3p125 (2012-02-16) [x86_64-darwin11.3.0]"
您的Nokogiri版本很糟糕(可能依赖于一个糟糕的libxml2版本),或者您的代码非常不同,您需要为我们提供重现问题的方法。
答案 1 :(得分:0)
我也遇到了这个“问题”,但是经过一些头疼,我发现了我做错了什么......我试图通过打印结果来调试xpath,如
product_element = Nokogiri.XML(xml).xpath('//root/products/product')
print "product_element is - #{product_element}\n"
打印出元素的字符串版本,但是当我使用
时product_element = Nokogiri.XML(xml).xpath('//root/products/product')
p product_element
正确地将其显示为NodeSet。
......这可能不是你发生的事情,但是