0

私は次のxmlを持っています:

        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <string>Some Content</string>
        <key>Some Text</key>
        <integer>1</integer>
        <key>Some Text</key>
        <true/>
        <key>Some Text</key>
        <true/>
        <key>Some Text</key>
        <integer>6</integer>
        <key>Some Text</key>
        <true/>

キー/値を持つハッシュを取得するようにRubyXMLSimplegemを構成するにはどうすればよいですか?または、XMLSimpleは間違ったツールですか?

ご協力いただきありがとうございます!

4

1 に答える 1

1

XMLSimple についてはわかりませんが、Nokogiri を使用できます。このような何かがうまくいくはずです:

def unpack_value(node)
    return node.text      if(node.node_name == 'string')
    return node.text.to_i if(node.node_name == 'integer')
    return true           if(node.node_name == 'true')
    return false          if(node.node_name == 'false')
    # etc.
end

doc = Nokogiri::XML('<xml>' + your_key_value_xml + '</xml>')
h   = doc.search('key').each_with_object({ }) { |n, h| h[n.text] = unpack_value(n.next_element) }

XML にすでに<xml>ラッパーがある場合は、それらを追加する必要はありません。

このdoc.search呼び出しにより、すべての<key>要素を含むイテレータが提供されます。each_with_object次に、ハッシュを構築するために繰り返します。このtextメソッドは、ノードのコンテンツをnext_element提供し、手元にある の直後に続くノードを提供します<key>unpack_value考えられるすべての値の型を説明するために少し調整する必要があるかもしれませんが、それは非常に簡単です。

このアプローチは、以前の s を新しいもので上書き<key>しますが、複製で何かをしたい場合は、小さな単一のキー ハッシュの配列を生成するように変更するのは非常に簡単です。

于 2011-08-19T08:54:59.380 に答える