0

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

谢谢你的帮助!

4

1 回答 1

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一下以考虑所有可能的值类型,但这很简单。

这种方法会用新的 s 覆盖以前<key>的 s,但是如果你想对重复项做一些事情,很容易改变它产生一个小的单键散列数组。

于 2011-08-19T08:54:59.380 回答