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”和“库存数量”属性的记录创建相应的记录。

这是我到目前为止所得到的,但不是创建单独的记录,而是在上述情况下创建两条记录并将 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 回答