2012-03-30 5 views
3

Ich versuche, XML in Ruby mit Nori zu analysieren, die intern Nokogiri verwendet. Die XML hat einige Tags wiederholt und die Bibliothek parst Tags als Arrays und nicht wiederholt Tags als normale Elemente (Hash)Wie wird die Reihenfolge in der Konvertierung von XML-Array zu Hash beibehalten?

<nodes> 
    <foo> 
    <name>a</name> 
    </foo> 
    <bar> 
    <name>b</name> 
    </bar> 
    <baz> 
    <name>c</name> 
    </baz> 
    <foo> 
    <name>d</name> 
    </foo> 
    <bar> 
    <name>e</name> 
    </bar> 
</nodes> 

als

{nodes: { 
    foo: [{name: "a"}, {name: "d"}], 
    bar: [{name: "b"}, {name: "e"}], 
    baz: {name: "c"} 
}} 

analysiert wiederholt Wie behalte ich die Reihenfolge der Elemente im resultierenden Hash wie die Ausgabe unten?

{nodes: [ 
     {foo: {name: "a"}}, 
     {bar: {name: "b"}}, 
     {baz: {name: "c"}}, 
     {foo: {name: "d"}}, 
     {bar: {name: "e"}}, 
    ]} 

(Dies kann eine Bibliothek spezifische Frage sein. Aber die Absicht ist, zu wissen, ob jemand ein ähnliches Problem und wie zu analysieren es richtig konfrontiert)

+2

Ich sehe nicht, was die gewünschte Ausgabe wäre. Denken Sie daran, dass Hashwerte nicht mehrere Werte mit demselben Schlüssel haben können. –

+0

Aktualisierte Frage mit erwarteter Ausgabe – Sathish

Antwort

1

Nori nicht tun kann dies auf seinem eigenen. Was können Sie tun, ist die Melodie Nori Ausgabe wie folgt:

input = {nodes: { 
    foo: [{name: "a"}, {name: "d"}], 
    bar: [{name: "b"}, {name: "e"}], 
    baz: {name: "c"} 
}} 

def unfurl(hash) 
    out=[] 
    hash.each_pair{|k,v| 
    case v 
    when Array 
     v.each{|item| 
     out << {k => item} 
     } 
    else 
     out << {k => v} 
    end 
    } 
    return out 
end 

output = {:nodes => unfurl(input[:nodes])} 

puts output.inspect 

Dadurch wird die Ausgabe druckt, die die ursprüngliche Frage angefordert, die als XML-Reihenfolge unterscheidet:

{nodes: [ 
    {foo: {name: "a"}}, 
    {foo: {name: "d"}}, 
    {bar: {name: "b"}}, 
    {bar: {name: "e"}}, 
    {baz: {name: "c"}}, 
]} 
+0

Ich würde immer noch die ursprüngliche Reihenfolge in den XMLs auf diese Weise verlieren. Um die Reihenfolge beizubehalten, muss ich mich sowohl mit dem xml als auch mit dem Hash-Code frei entfalten. – Sathish

+0

Kannst du mehr über die gewünschte Reihenfolge sagen? Das von mir gepostete Skript generiert die von Ihnen angeforderte Reihenfolge (die sich von der Reihenfolge der Elemente im XML-Dokument unterscheidet). – joelparkerhenderson

+0

Ich habe in der Frage einen Fehler gemacht. Die Reihenfolge, die ich erwartet habe, ist [foo1, bar1, baz1, foo2, bar2]. Und wenn es eine Möglichkeit gibt, die Reihenfolge beizubehalten, ohne auf Original-XML zurückzugreifen – Sathish

Verwandte Themen