从结构中抓取成员

时间:2014-03-09 02:11:21

标签: ruby struct

我希望能够迭代一些xml我正在使用结构,我希望能够在将它们添加到数组后从中获取成员,这是我做错的方式吗?

我希望将许多不同的结构保存到同一个数组中并通过

调用它们
systems.os 
systems.base
systems.network

目前我

System = Struct.new(:os, :base, :number)
Networks = Struct.new(:network)

  systems = []

  filename = "/lib/xml/boxes.xml"
    doc = Nokogiri::XML(File.open(filename))

    doc.search('//systems/system').map do |system|

    systems << System.new(
      system.at('@os').text, 
      system.at('@basebox').text, 
      system.at('@number').text)

    systems << Networks.new(
      system.css('networks network').collect do |network| 
        { 'network' => network['name'] } 
    end)
  end

目前如果我这样做

puts systems

它返回

#<struct System os="linux", base="precise32", number="1">
#<struct Networks network=[{"network"=>"homeonly"}, {"network"=>"homeonly2"}]>

但我做不到

puts systems.os
Error: undefined method `os' for #<Array:0x007fa6198b2e20>

更新了XML以说明为什么我希望它们在同一个数组中。

<systems>
<systems>
<system number="1" os="linux" basebox="precise32" >
<network name="homeonly" ></network>
<network name="homeonly2"></network>
</networks>
</system>


<system number="2" os="linux" basebox="AddBaseBox" >
<networks>
<network name="homeonly" ></network>
<network name="homeonly2"></network>
</networks>
</system>
</systems>

我正在访问的其他属性和添加到数组也为此示例缩短了。我想要单独与每个对象交谈的原因

2 个答案:

答案 0 :(得分:1)

尝试:

puts systems[0].os

或:

p systems.map { |s| s.os }

实际上,我上面建议的map电话只有在你对systems数组中的内容更加自律时才会有效。您可能不应该像现在一样将Network对象放入系统数组中。

请务必记住systems应该是System个对象的数组,但它本身不是System个对象,所以它不知道os是什么手段。您需要使用数组方法来获取数组的元素。

答案 1 :(得分:1)

这就是我所寻求的,使用类而不是struct。

class System
  attr_accessor :os, :base, :number, :network
end

def read_systems_xml
  systems = []

  filename = "/lib/xml/boxes.xml"
    doc = Nokogiri::XML(File.open(filename))

    doc.search('//systems/system').map do |system|

      system_class = System.new
      system_class.os = system.at('@os').text
      system_class.base = system.at('@basebox').text
      system_class.number = system.at('@number').text

    system_class.network = system.css('networks network').collect do |network| 
      { 'network' => network['name'] } 
    end
    systems << system_class
  end
end
相关问题