2012-03-30 19 views
3

内部的にNokogiriを使用しているNoriを使用してRubyでXMLを解析しようとしています。 XMLは、いくつかのタグが繰り返されていると、ライブラリは私がの順序を保持するにはどうすればよいXML配列からハッシュ変換への順序を保持する方法は?

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

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

として解析され、通常の要素(ハッシュ)などの配列と非繰り返しタグなどのタグを繰り返し構文解析します結果のハッシュの要素は以下のように出力されますか?

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

は(これは、ライブラリ具体的な質問かもしれません。しかし、その意図は、誰もが同様の問題に直面しているし、それを正しく解析する方法かどうかを知ることです)

+2

を私が希望するものが表示されません出力されるでしょう。ハッシュは同じキーで複数の値を持つことはできません。 –

+0

期待された出力で質問を更新しました – Sathish

答えて

1

ノリが独自にこれを行うことはできません。あなたにできることは曲が、このようなノリの出力です:

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 

これは、XML注文と異なる元の質問が要求した出力出力します

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

私は今でもXMLの元の順序をこのように失っています。順序を保持するには、xmlとハッシュの両方を使用して展開する必要があります。 – Sathish

+0

希望の順序についてもっと詳しく言うことができますか?私が掲示したスクリプトはあなたが要求した順序を生成します(これはXML文書の要素の順序とは異なります)。 – joelparkerhenderson

+0

質問に間違いをしました。期待した注文は[foo1、bar1、baz1、foo2、bar2]です。オリジナルのxmlを参照せずに注文を保持する方法がある場合 – Sathish

関連する問題