我有以下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是错误的工具?
感谢您的帮助!
答案 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>
,但是如果你想对重复项做一些小的单键哈希,就很容易改变它。