感觉我在这里错过了一些非常明显但却看不到的东西。
我有一个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'属性的相应记录。
这是我到目前为止所做的,但是在上面的例子中,它不是创建单独的记录,而是创建两个记录并插入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定位器将所有出现的内容返回到一个数组中,我正在调用该数组并为每个记录插入它。
谢谢!
答案 0 :(得分: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后代。
答案 1 :(得分:1)
Smth喜欢:
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