繁体   English   中英

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"]}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM