【问题标题】:XMLSimple parse Key Value to HashXMLSimple 将键值解析为哈希
【发布时间】:2011-08-19 08:26:47
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 如果键和值没有分组在另一个 XML 元素中,那么解析起来相当糟糕。
  • @Michael:用 Nokogiri 解析非常简单,不过看起来不像 XMLSimple 的风格。
  • @mu 同意,我应该更仔细地措辞我早上的答案。 :-)

标签: ruby xml xml-simple


【解决方案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 已经有 &lt;xml&gt; 包装器,那么您不需要添加它们。

doc.search 调用将为您提供一个包含所有 &lt;key&gt; 元素的迭代器。然后你用each_with_object 迭代来构建散列。 text 方法为您提供节点的内容,next_element 为您提供紧跟在您手头的&lt;key&gt; 之后的节点。您可能需要稍微调整 unpack_value 以考虑所有可能的值类型,但这很简单。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多