目前我通过这样做得到一系列哈希:
f = File.open("public/odds/test.xml")
xml = Nokogiri::XML(f)
path = "//demo/test1/test"
xml.xpath(path).map do |x|
{'country' => x.parent}
end
我的结果样本:
[{"country"=>"france"}, {"country"=>"singapore"}, {"country"=>"thailand"}]
现在我有不同的xml文件,我正在循环遍历所有文件:
@files = ['a', 'b', 'c']
@files.each do |file|
f = File.open("public/odds/#{file}.xml)
xml = Nokogiri::XML(f)
path = "//demo/test1/test"
xml.xpath(path).map do |x|
{'country' => x.parent}
end
当循环遍历每个文件时,我希望得到3个不同的结果,例如[{"country"=>"france"}, {"country"=>"singapore"}, {"country"=>"thailand"}]
。如何将它们合并在一起以便它们位于1个数组中?
答案 0 :(得分:1)
我想你这样试试。只需声明新数组,在该数组arr << {'country' => x.parent}
内推送所有哈希值,并将map
替换为each
循环
arr=[]
@files = ['a', 'b', 'c']
@files.each do |file|
f = File.open("public/odds/#{file}.xml)
xml = Nokogiri::XML(f)
path = "//demo/test1/test"
xml.xpath(path).each do |x|
arr << {'country' => x.parent}
end
end
return arr
答案 1 :(得分:1)
你想注射结果吗? Array#inject
来救援:
path = "//demo/test1/test"
# ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓
result = @files.inject([]) do |memo, file|
File.open("public/odds/#{file}.xml") do |f|
xml = Nokogiri::XML(f)
# ⇓⇓⇓⇓⇓⇓⇓
memo << xml.xpath(path).map do |x|
{'country' => x.parent}
end
end
end.flatten
puts result
#⇒ [ {"country"=>"france"}, {"country"=>"singapore"}, {"country"=>"thailand"},
# ...
# ... ]
另外,考虑使用带有块的File#open
。在您的代码中,打开的文件保持未闭合状态,而块将在返回时自动关闭它们。是否仍然想要使用File#new
(≡File#open
没有阻止),只要不再需要该文件,就应该明确地调用f.close
。