2011-08-19 115 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,但它很容易改變它產生一個小的單一密鑰散列數組,如果你想對重複做一些事情。