2016-05-15 10 views
1

In Ordnung, also habe ich ein kleines Problem, das ich noch nie zuvor gesehen habe und ich bin festgefahren. Ich habe zwei XML-Dateien, die ich zu einer zusammenführen muss.Ruby Merge 2 XML-Dateien mit Nokogiri

Die ersten XML-Dateien ist Product.xml, die eine Liste von Limonaden enthält und hier ist ein Beispiel:

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

Die zweite XML-Datei Ingredients.xml ist, und es ist ein bisschen schwierig ... Jedes Produkt hat mehrere Zutaten. Die Datei wie folgt aussieht:

<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> 

I Rubin 2.2.4 und Nokogiri verwenden. Das Problem ist, dass jedes Produkt mehrere separate Zutaten hat. Ich versuche, diese Zutaten von UPC zusammenzuführen. Da jede Zutat auf einen UPC abgestimmt ist und jeder UPC einzigartig ist.

Antwort

0

Ich würde vorschlagen, die XML-Dateien in ein Ruby-Objekt zu konvertieren, dann das Zusammenführen und schließlich die XML-Serialisierung.

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 

und die Werte der Variablen „Limonaden“ aussehen würde gerne diese

{"8675309"=>{:name=>"Coke", :nutrients=>["Calories", "Fat"]}, "4283123"=>{:name=>"Yoohoo", :nutrients=>["Sugar"]}} 
+0

Dieser ziemlich nahe ist, was ich gesucht habe, aber es scheint, die Struktur der XML-Dateien zu verlieren wenn ich versuche, das neue XML zu erstellen. – CodeHard

+0

@CodeHard nehmen Sie meinen Code als Beispiel, können Sie die Struktur in Ruby aufbauen, die Sie wollen. – nickcen