Nokogiri xpath查询结果是String而不是NodeSet

时间:2012-05-17 14:04:10

标签: ruby xpath nokogiri

我有一个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。

2 个答案:

答案 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。

......这可能不是你发生的事情,但是