循环使用XML在Ruby中创建哈希数组

时间:2012-08-24 12:34:04

标签: ruby xml arrays hashmap

我有以下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”属性都是数组中的哈希值。

E.g。

区域[0] =哈希[Id =&gt; 32,Name =&gt; lobby,NId =&gt; ssdfrgfdfg]

区域[1] =哈希[Id =&gt; 33,姓名=&gt; conf,NId =&gt; sdfsfewr232f] 等...

我有限的XML解析知识已成为一个问题。我真正知道的是如何提取单个元素。 E.g。

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

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

由于

2 个答案:

答案 0 :(得分:2)

你只需要使用nori gem

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

然后,如果您需要以这种方式存储数据,那么将此嵌套哈希转换为哈希数组应该是直截了当的。

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

答案 1 :(得分:1)

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

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
相关问题