XMLSimple将键值解析为哈希值

时间:2011-08-19 08:26:47

标签: ruby xml xml-simple

我有以下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/>

如何配置Ruby XMLSimple gem以获取带键/值的哈希值? 或者XMLSimple是错误的工具?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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以考虑所有可能的值类型,但这非常简单。

这种方法会用新的方法覆盖以前的<key>,但是如果你想对重复项做一些小的单键哈希,就很容易改变它。