【问题标题】:Looping through XML to create an array of hashes in Ruby循环遍历 XML 以在 Ruby 中创建哈希数组
【发布时间】:2012-08-24 12:34:03
【问题描述】:

我有以下 XML

<CallResult>
  <Success>true</Success>
  <Result>
    <ZoneInfo>
      <Id>3</Id>
      <Name>test-room</Name>
      <NId>sdfsdg</NId>
    </ZoneInfo>
    <ZoneInfo>
      <Id>16</Id>
      <Name>Dynamic</Name>
      <NId>sadadrwed543th</NId>
    </ZoneInfo>
    <ZoneInfo>
      <Id>32</Id>
      <Name>lobby</Name>
      <NId>ssdfrgfdfg</NId>
    </ZoneInfo>
    <ZoneInfo>
      <Id>33</Id>
      <Name>conf</Name>
      <NId>sdfsfewr232f</NId>
    </ZoneInfo>
  </Result>
  <Message>Success</Message>
</CallResult>

我正在尝试解析 XML,以便每个不同的“ZoneInfo”属性都是数组中的哈希。

例如

Zones[0] = Hash[Id => 32, Name => lobby, NId => ssdfrgfdfg]

Zones[1] = Hash[Id => 33, Name => conf, NId => sdfsfewr232f] 等等……

我有限的 XML 解析知识得到了收获。我真正知道的是如何提取单个元素。例如

doc = REXML::Document.new(xmlData)
doc.elements.each("CallResult/Success") do |ele|
  p ele.text;
end

有人可以提供一些关于如何循环仅从每个“ZoneInfo”元素中提取信息的更多信息吗?

谢谢

【问题讨论】:

    标签: ruby xml arrays hashmap


    【解决方案1】:

    我使用另一个 gem 'nokogiri',也许是现在解析 HTML/XML 的最佳 gem。

    require 'nokogiri'
    
    str = "<CallResult> ......"
    doc = Nokogiri.XML(str)
    Zones = []
    doc.xpath('//ZoneInfo').each do |zone|
      Zones << { "Id" => zone.xpath('Id').text, "Name" => zone.xpath('Name').text, "NId" => zone.xpath("NId").text}
    end
    

    【讨论】:

      【解决方案2】:

      你只需要使用紫菜宝石

      require 'nori'
      your_hash = Nori.parse(your_xml)
      

      如果您需要以这种方式存储数据,那么将这个嵌套哈希转换为哈希数组应该很简单。

      如果您需要更多信息,这里有 api 文档 - http://rubydoc.info/gems/nori/1.1.3/frames

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-07
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        相关资源
        最近更新 更多