Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby将2个XML文件与Nokogiri合并_Ruby_Xml_Nokogiri - Fatal编程技术网

Ruby将2个XML文件与Nokogiri合并

Ruby将2个XML文件与Nokogiri合并,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,好吧,我有一个小问题,我从来没有遇到过,我被卡住了。我有两个XML文件需要合并成一个 第一个XML文件是Product.XML,其中包含苏打水列表,下面是一个示例: <Soda_List> <Soda> <UPC>8675309</UPC> <Name>Coke</Name> </Soda> <Soda> <UPC>4283123</UPC>

好吧,我有一个小问题,我从来没有遇到过,我被卡住了。我有两个XML文件需要合并成一个

第一个XML文件是Product.XML,其中包含苏打水列表,下面是一个示例:

<Soda_List>
  <Soda>
    <UPC>8675309</UPC>
    <Name>Coke</Name>
  </Soda>
  <Soda>
    <UPC>4283123</UPC>
    <Name>Yoohoo</Name>
  </Soda>
</Soda_List>

8675309
焦炭
4283123
Yoohoo
第二个XML文件是components.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>

8675309
卡路里
8675309
脂肪
4283123
糖

我正在使用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

我建议将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

这与我一直在寻找的非常接近,但是,当我试图构建新的XML时,它似乎丢失了XML文件的结构。@CodeHard以我的代码为例,你可以用ruby构建你想要的结构。然而,这与我一直在寻找的非常接近,当我试图构建新的XML时,似乎丢失了XML文件的结构。@CodeHard以我的代码为例,您可以用ruby构建您想要的结构。