使用nokogiri解析XML并创建具有多个属性的记录

use*_*277 3 ruby xml activerecord ruby-on-rails nokogiri

感觉像我在这里遗漏了一些非常明显但却看不到的东西.

我有一个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>
Run Code Online (Sandbox Code Playgroud)

我想循环变量并为每个变量创建一个包含'sku'和'inventory-quantity'属性的相应记录.

这是我到目前为止所做的,但不是创建单独的记录,在上面的例子中它创建了两个记录并插入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
Run Code Online (Sandbox Code Playgroud)

创造这个......

sku              inventory-quantity

123abc321cba     6822
123abc321cba     6822
Run Code Online (Sandbox Code Playgroud)

我真正想要的地方:

sku              inventory-quantity

123ab            68
321cba           22
Run Code Online (Sandbox Code Playgroud)

它看起来像是因为xpath定位器将所有出现的内容返回到一个数组中,我正在调用该数组并为每个记录插入它.

谢谢!

ben*_*der 14

答案很简单 - 而不是:

sku = product.xpath("//sku").text
quan = product.xpath("//inventory-quantity").text
Run Code Online (Sandbox Code Playgroud)

只需使用:

sku = product.xpath("sku").text
quan = product.xpath("inventory-quantity").text
Run Code Online (Sandbox Code Playgroud)

这是因为//sku选择了文档根目录的所有sku后代.