3

ここでかなり明白な何かが欠けているように感じますが、それを見ることはできません。

XML ファイルがあり、Nokogiri gem を使用しています。

XML は次のようになります (無限の量の「バリアント」を想像してみてください)。

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <variant> 
        <sku type="string">123abc</sku>
        <inventory-quantity type="integer">68</inventory-quantity> 
    </variant> 
    <variant> 
        <sku type="string">321cba</sku>
        <inventory-quantity type="integer">22</inventory-quantity> 
    </variant>
</products>

バリアントをループして、「sku」属性と「inventory-quantity」属性を含むそれぞれに対応するレコードを作成したいと考えています。

これは私がこれまでに得たものですが、個々のレコードを作成する代わりに、上記のケースでは 2 つのレコードを作成し、Nokogiri が返す完全な配列または NodeSet を各レコード属性に挿入します。したがって、この:

doc = Nokogiri::XML(File.open("#{Rails.root}/public/new.xml")) 

variant = doc.xpath("//variant")

variant.each do |product| 

  sku = product.xpath("//sku").text
  quan = product.xpath("//inventory-quantity").text

  Productmapping.create(:sku => sku, :product_quantity => quan)

end

これを作成します...

sku              inventory-quantity

123abc321cba     6822
123abc321cba     6822

私が実際に欲しいところ:

sku              inventory-quantity

123ab            68
321cba           22

xpath ロケーターがすべての出現箇所を配列に返し、その配列を呼び出して各レコードに挿入しているためのようです。

ありがとう!

4

2 に答える 2

14

答えは簡単です - 代わりに:

sku = product.xpath("//sku").text
quan = product.xpath("//inventory-quantity").text

ちょうど使用:

sku = product.xpath("sku").text
quan = product.xpath("inventory-quantity").text

これ//skuは、ドキュメント ルートのすべての sku 子孫を選択するためです。

于 2012-07-09T08:29:53.290 に答える
1

次のようなものです:

doc = Nokogiri::XML(File.open("#{Rails.root}/public/new.xml"))  

variant = doc.xpath("//variant")

sku, quan = nil, nil
variant.each do |product| 


  product.children.each do |child|
      case child.name
       when 'sku'  
          sku = child.text
       when 'inventory-quantity'
          quan = child.text
       end
    end

  Productmapping.create(:sku => sku, :product_quantity => quan)

end

または、より魔法的で美しくはないがコンパクトな方法:

sku = product.children[1].text
quan = product.children[3].text
于 2012-07-09T08:20:31.503 に答える