我希望能够迭代一些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>
我正在访问的其他属性和添加到数组也为此示例缩短了。我想要单独与每个对象交谈的原因
答案 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