2011-02-03 13 views
1

Nokogiriを使用してXMLファイルを解析し、データベース内に新しい「製品」を作成するノードをループするインポートスクリプトを作成しています。厄介な価格フィールド(フロート)を除いてすべてがうまくいく。Nokogiriを使用したNoMethodError

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メソッドを呼び出していない場合でも表示されますが、明白な方法でありますエラーが発生しました!

誰かがこの光を放つことができますか?

答えて

1

xpath関数は、to_f関数が定義されていないNodeSetを返します。私はそれから文字列の値を抽出し、to_fを呼び出す方法についてNokogiriのドキュメントを見てみることをお勧めします。

+2

ありがとうございます。私は答えがなかったので、あなたが欠けていたものを文書化するためのあなたのコメントにinner_textメソッド – Zinc

+0

+1がありませんでした。 –

4

#xpath,#cssおよび#findのメソッドは、要素が一致していても、サブクラス化された配列であるノードセットを返します。浮動小数点としての価格を抽出するには:

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

答えも+1 – Zinc

+1

ノードセットを返す '#search'とそのエイリアス'#/ 'もあります。比較すると、 '#at'、そのエイリアス'#% 'と'#css_at'は最初に一致するノードを返します。 –

関連する問題