2011-08-19 106 views
0

我有以下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是错误的工具?

感谢您的帮助!

+0

如果关键字和值没有被分组在另一个XML元素中,那么解析起来就相当糟糕。 –

+0

@Michael:与Nokogiri一起解析很简单,虽然看起来不像XMLSimple的风格。 –

+0

@mu同意,我应该更仔细地说我早上的答案。 :-) –

回答

1

我不确定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,但它很容易改变它产生一个小的单一密钥散列数组,如果你想对重复做一些事情。