我正在创建一个导入脚本,使用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方法,也会出现相同的错误
我猜我需要以某种方式将节点值转换为浮点数,但显而易见的方法是导致错误!
有人可以对这一点有所了解吗?
答案 0 :(得分:4)
#xpath
,#css
和#find
方法返回节点集,即使只有元素匹配,它们也是子类化数组。要将价格提取为浮点数:
node.xpath("./price/buynow/text()").map(&:to_f).first
答案 1 :(得分:1)
xpath函数返回一个NodeSet,它没有定义to_f函数。我建议你看看Nokogiri文档,了解如何从中提取字符串值,然后调用to_f。