使用Nokogiri选择节点,然后选择下一个指定的节点

时间:2015-12-05 17:56:29

标签: ruby nokogiri

我试图在XML文档中一起选择两个节点并将其打印出来。 我似乎无法将它们打印在一起。它们总是输出为“第一个节点列表”,然后是“第二个节点列表”。一个例子可以更好地说明:

<result>
   <name>Peter</name>
   <school>main school</school>
   ...
   <score>4.5</score>
</result>
<result>
   <name>John</name>
   ..
   ...
   <score>3.5</score>
</result>

每个<result>的格式并不总是相同。我需要选择<name><score>,以便它们一起出现:

Peter
4.5
John
3.5

Peter   4.5
John    3.5

到目前为止我只能得到这样的结果:

Peter
John
4.5
3.5

我一直在尝试各种不同的方法,如:

doc.xpath("//name/").xpath("//score").each do |link|
  puts link

和嵌套do / end循环的其他组合,但没有任何作用。 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

最明智的方法可能是首先选择result个节点,然后为每个result选择其namescore个节点:

doc.xpath('//result').each do |result|
  name = result.at_xpath('./name').text
  score = result.at_xpath('./score').text
  # handle name and score however you want...
end

(这假设每个result都有一个name孩子和一个score孩子。)

答案 1 :(得分:3)

也许您可以将name值存储在数组中,然后在迭代score值时迭代数组,同时打印它们:

array_of_names = []

doc.xpath("//name").each do |name|
  array_of_names << name
end

counter = 0
doc.xpath("//score").each do |score|
  puts "#{array_of_names[counter]}: #{score}"
  counter += 1
end