Ruby 如何使用Nokogiri循环XML以将某些部分添加到数组中?

Ruby 如何使用Nokogiri循环XML以将某些部分添加到数组中?,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,我将此作为我的XML: <systems> <system number="2" > <lists> <list critical="user" access="remote"></list> <list critical="root" access="local"></list> </lists> <os system="linux" basebox="AddBaseBox" ><

我将此作为我的XML:

<systems>
<system number="2" >
<lists>
<list critical="user" access="remote"></list>
<list critical="root" access="local"></list>
</lists>
<os system="linux" basebox="AddBaseBox" ></os>
<networks>
<network name="homeonly" ></network>
<network name="homeonly2"></network>
</networks>
</system>
</systems>
我希望阵列中显示多个列表和多个网络。我做错了什么

我想要的输出是:

{"critical"=>"user", "access"=>"remote"}
{"root"=>"user", "access"=>"local"}
2
linux
{"network"=>"homeonly"}
{"network"=>"homeonly2"}

Nokogiri允许您使用CSS选择器访问XML。当选择器匹配多个内容时,Nokogiri将返回这些内容的数组。在这里,我们使用Ruby的
Array#collect
方法根据块返回的内容返回一个新的项目数组:

lists = system.css('lists list').collect do |list| 
  { 'critical' => list['critical'], 'access' => list['access'] } 
end

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

这将为您提供所需的输出。

显示您的预期输出。。。所以我可以给你一些代码让你开始,你的代码没有太多的Rubyish…)我的错。2秒后我将发布expeced outputadded我想接收的输出我希望你得到你的答案…:)是的,6位回答得很好:)这已经过去了,完成了:)干杯会记住未来的css选择器,我真的认为我不应该看它,因为它会看css元素或其他东西。哈哈,只是为了清楚,这种方法不需要CSS选择器;您还可以使用
system.xpath('//lists/list')
system.xpath('//networks/network')
@Sixty4Bit:您提供的CSS在技术上是不等效的。要指定子元素,请使用
lists>list
而不是
lists-list
@MarkThomas感谢您的澄清。
lists list
是否与列表的后代列表匹配?它相当于
system.xpath('//lists//list')
@Sixty4Bit Yes。请注意,您可以使用Nokogiri的
xpath\u for()
查看任意CSS如何在内部转换为xpath。
{"critical"=>"user", "access"=>"remote"}
{"root"=>"user", "access"=>"local"}
2
linux
{"network"=>"homeonly"}
{"network"=>"homeonly2"}
lists = system.css('lists list').collect do |list| 
  { 'critical' => list['critical'], 'access' => list['access'] } 
end

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