NoMethodError с использованием Nokogiri - PullRequest
1 голос
/ 04 февраля 2011

Я создаю скрипт импорта с использованием Nokogiri для анализа XML-файла, а затем перебираю узлы, создавая новые «Продукты» в моей базе данных.Все работает нормально, за исключением надоедливого поля цены (которое является плавающей точкой).

Product.create(:name => node.xpath("./text/name/text()"), 
               :description => node.xpath("./text/desc/text()"),
               :brand => node.xpath("./brand/brandName/text()"),
               :merchant => node.xpath("../@name"),
         >> (A) #:price => 1.99))
         >> (B) #:price => node.xpath("./price/buynow/text()"))
         >> (C) #:price => node.xpath("./price/buynow/text()").to_f))

Рассматриваемый узел XML выглядит следующим образом ...

<buynow>6.99</buynow>  

Когда я пытаюсь использовать строку (A) чтобы проверить, что он работает нормально, но, очевидно, это нежелательно.

Когда я пытаюсь получить строку из узла (B) или (C), моя страница зависает, WEBrick необходимо перезапустить (нетошибки в терминале), и в журнале появляется следующая ошибка:

NoMethodError (undefined method `to_f' for [#<Nokogiri::XML::Text:0x81f5220c "6.99">]:Nokogiri::XML::NodeSet):

Примечание: такая же ошибка появляется, даже если я не вызываю явно метод to_f

Полагаю, мне нужно каким-то образом преобразовать значение узла в число с плавающей точкой, но очевидный способ - вызвать ошибку!

Может кто-нибудь пролить свет на этот вопрос?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011
Методы

#xpath, #css и #find возвращают наборы узлов, которые являются подклассами, даже если был найден только соответствующий элемент.Чтобы извлечь цену как число с плавающей запятой:

node.xpath("./price/buynow/text()").map(&:to_f).first
1 голос
/ 04 февраля 2011

Функция xpath возвращает NodeSet , для которого не определена функция to_f.Я предлагаю вам взглянуть на документацию Nokogiri о том, как извлечь из нее строковое значение, а затем вызвать to_f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...