XMLSimple解析键值散列
问题描述:
我有以下XML:XMLSimple解析键值散列
<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宝石来获得与键/值哈希? 或者XMLSimple是错误的工具?
感谢您的帮助!
答
我不确定XMLSimple,但可以使用Nokogiri。如果您是XML已经有<xml>
包装那么你并不需要添加它们
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) }
:像这样的东西应该做的伎俩。
doc.search
调用会为您提供一个包含所有<key>
元素的迭代器。然后,您使用each_with_object
来迭代构建哈希。 text
方法为您提供节点的内容,next_element
为您提供紧接在手头的<key>
之后的节点。您可能需要稍微调整以考虑所有可能的值类型,但这非常简单。
这种方法将覆盖以前的<key>
s,但它很容易改变它产生一个小的单一密钥散列数组,如果你想对重复做一些事情。
如果关键字和值没有被分组在另一个XML元素中,那么解析起来就相当糟糕。 –
@Michael:与Nokogiri一起解析很简单,虽然看起来不像XMLSimple的风格。 –
@mu同意,我应该更仔细地说我早上的答案。 :-) –