Ruby 使用 Nokogiri 合并 2 XML 个文件
Ruby Merge 2 XML files with Nokogiri
好吧,我遇到了一个以前从未 运行 遇到过的小问题,我被卡住了。我有两个 XML 个文件需要合并为一个。
前 XML 个文件是 Product.xml,其中包含苏打水列表,这是一个示例:
<Soda_List>
<Soda>
<UPC>8675309</UPC>
<Name>Coke</Name>
</Soda>
<Soda>
<UPC>4283123</UPC>
<Name>Yoohoo</Name>
</Soda>
</Soda_List>
第二个XML文件是Ingredients.xml,有点棘手...每个产品都有多种成分。该文件如下所示:
<Soda_List>
<Nutrients>
<UPC>8675309</UPC>
<Name>Calories</Name>
</Nutrients>
<Nutrients>
<UPC>8675309</UPC>
<Name>Fat</Name>
</Nutrients>
<Nutrients>
<UPC>4283123</UPC>
<Name>Sugar</Name>
</Nutrients>
</Soda_List>
我正在使用 Ruby-2.2.4 和 Nokogiri。问题是每种产品都有多种不同的成分。我正在尝试通过 UPC 合并这些成分。由于每种成分都与 UPC 匹配,并且每个 UPC 都是唯一的。
我建议将 xml 文件转换为 ruby 对象,然后进行合并,最后进行 xml 序列化。
require 'nokogiri'
s1 = '''<Soda_List>
<Soda>
<UPC>8675309</UPC>
<Name>Coke</Name>
</Soda>
......
</Soda_List>'''
s2 = '''<Soda_List>
<Nutrients>
<UPC>8675309</UPC>
<Name>Calories</Name>
</Nutrients>
<Nutrients>
......
</Soda_List>'''
doc1 = Nokogiri::XML(s1)
doc2 = Nokogiri::XML(s2)
sodas = {}
doc1.xpath('//Soda').each do |soda|
sodas[soda.at_xpath('./UPC').text] = {name: soda.at_xpath('./Name').text, nutrients: []}
end
doc2.xpath('//Nutrients').each do |nutrient|
upc = nutrient.at_xpath('./UPC').text
name = nutrient.at_xpath('./Name').text
sodas[upc][:nutrients].push(name) if sodas.has_key?(upc)
end
变量的值"sodas"看起来像这样
{"8675309"=>{:name=>"Coke", :nutrients=>["Calories", "Fat"]}, "4283123"=>{:name=>"Yoohoo", :nutrients=>["Sugar"]}}
好吧,我遇到了一个以前从未 运行 遇到过的小问题,我被卡住了。我有两个 XML 个文件需要合并为一个。
前 XML 个文件是 Product.xml,其中包含苏打水列表,这是一个示例:
<Soda_List>
<Soda>
<UPC>8675309</UPC>
<Name>Coke</Name>
</Soda>
<Soda>
<UPC>4283123</UPC>
<Name>Yoohoo</Name>
</Soda>
</Soda_List>
第二个XML文件是Ingredients.xml,有点棘手...每个产品都有多种成分。该文件如下所示:
<Soda_List>
<Nutrients>
<UPC>8675309</UPC>
<Name>Calories</Name>
</Nutrients>
<Nutrients>
<UPC>8675309</UPC>
<Name>Fat</Name>
</Nutrients>
<Nutrients>
<UPC>4283123</UPC>
<Name>Sugar</Name>
</Nutrients>
</Soda_List>
我正在使用 Ruby-2.2.4 和 Nokogiri。问题是每种产品都有多种不同的成分。我正在尝试通过 UPC 合并这些成分。由于每种成分都与 UPC 匹配,并且每个 UPC 都是唯一的。
我建议将 xml 文件转换为 ruby 对象,然后进行合并,最后进行 xml 序列化。
require 'nokogiri'
s1 = '''<Soda_List>
<Soda>
<UPC>8675309</UPC>
<Name>Coke</Name>
</Soda>
......
</Soda_List>'''
s2 = '''<Soda_List>
<Nutrients>
<UPC>8675309</UPC>
<Name>Calories</Name>
</Nutrients>
<Nutrients>
......
</Soda_List>'''
doc1 = Nokogiri::XML(s1)
doc2 = Nokogiri::XML(s2)
sodas = {}
doc1.xpath('//Soda').each do |soda|
sodas[soda.at_xpath('./UPC').text] = {name: soda.at_xpath('./Name').text, nutrients: []}
end
doc2.xpath('//Nutrients').each do |nutrient|
upc = nutrient.at_xpath('./UPC').text
name = nutrient.at_xpath('./Name').text
sodas[upc][:nutrients].push(name) if sodas.has_key?(upc)
end
变量的值"sodas"看起来像这样
{"8675309"=>{:name=>"Coke", :nutrients=>["Calories", "Fat"]}, "4283123"=>{:name=>"Yoohoo", :nutrients=>["Sugar"]}}