2012-05-17 2 views
-1

У меня есть узел Nokogiri, который я делаю по запросу xpath, на котором должен возвращаться узел NodeSet. Вместо этого он возвращает строку. Я проверил источник xml и обнаружил, что данные содержат только один элемент, а не многие.Результаты запроса Nokogiri xpath в String вместо NodeSet

Должен ли он возвращать узел NodeSet с одним значением вместо строки? Как мне с этим справиться?

Вот псевдо XML, который правильно возвращает NodeSet 2 записей:

<root> 
    <products> 
     <product> 
      <productID>1</productID> 
     </product> 
     <product> 
      <productID>2</productID> 
     </product> 
    </product> 
</root> 

Вот псевдо XPath запроса:

//root/products/product 

Если XML содержит только один продукт, Я получаю строку вместо NodeSet с 1 записью

<root> 
    <products> 
     <product> 
      <productID>1</productID> 
     </product> 
    </product> 
</root> 

Обновление 6/12/2012: Я по-прежнему считаю, что это ошибка в Nokogiri. Вышеописанный псевдо xml не воспроизводит условие, однако у меня есть несколько примеров xml от клиента, которые воспроизводят проблему. Возможно, я мог бы опубликовать обфускацию версии xml. В любом случае я изменил код, чтобы использовать XmlSimple вместо Nokogiri.

+0

Это зависит от вашего XPath, но нет никакого способа, мы можем сказать, если вы не размещаете его. – JWiley

+0

Я обновил его с помощью запроса _pseudo_ xml и xpath. –

+0

Почему * псевдо *? Если предоставленный XML-документ не является фактическим, как вы можете ожидать, что люди помогут? –

ответ

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, вероятно), или ваш код достаточно различны, что вам необходимо предоставить нам способ, чтобы воспроизвести твоя проблема.

+0

Я запускаю Nokogiri "1.5.3.rc5" на Ruby "ruby 1.9.2p290 (2011-07-09 версия 32553) [x86_64-darwin11.3.0]". Изучит далее ... –

+0

@Edward См. [Эту ссылку] (https://github.com/tenderlove/nokogiri/wiki/what-to-do-if-libxml2-is-being-a-jerk), чтобы гарантировать, что ваш libxml2 является недавним. – Phrogz

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.

... Это не может быть то, что происходит с вами, но

+0

Нет, к сожалению, это не мой случай –

Смежные вопросы