使用Nokogiri的NoMethodError

时间:2011-02-03 21:46:22

标签: ruby-on-rails ruby

我正在创建一个导入脚本,使用Nokogiri解析XML文件,然后循环遍历节点,在我的数据库中创建新的“Products”。除了讨厌的价格区域(浮动)之外,一切正常。

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 个答案:

答案 0 :(得分:4)

#xpath#css#find方法返回节点集,即使只有元素匹配,它们也是子类化数组。要将价格提取为浮点数:

node.xpath("./price/buynow/text()").map(&:to_f).first

答案 1 :(得分:1)

xpath函数返回一个NodeSet,它没有定义to_f函数。我建议你看看Nokogiri文档,了解如何从中提取字符串值,然后调用to_f。