我正在尝试在xml下面打印,这里针对这个问题进行了简化。 我很难按照我想要的方式打印它。 如何在下面打印正确的输出?
# xml
<Info>
<Server NAME="host1">
<From_Version>
<Transition INDEX="1" VALUE="1234"/>
</From_Version>
<state>
<Transition INDEX="1" DATE="2016-06-14"/>
<Transition INDEX="2" DATE="2016-06-15"/>
</state>
</Server>
<Server NAME="host2">
<From_Version>
<Transition INDEX="1" VALUE="1234"/>
</From_Version>
<state>
<Transition INDEX="1" DATE="2016-07-14"/>
<Transition INDEX="2" DATE="2016-07-15"/>
</state>
</Server>
</Info>
# code
require 'nokogiri'
xml = File.open( "d:/temp/test.xml" )
doc = Nokogiri::XML(xml)
doc.xpath("//Server").each do |row|
#puts row
puts row["NAME"]
#puts s
row.xpath("//state//Transition").each do |idx|
puts "#{idx['INDEX']} #{idx['DATE']}"
end
end
# current output
host1
1 2016-06-14
2 2016-06-15
1 2016-07-14
2 2016-07-15
host2
1 2016-06-14
2 2016-06-15
1 2016-07-14
2 2016-07-15
# correct output
host1
1 2016-06-14
2 2016-06-15
host2
1 2016-07-14
2 2016-07-15
答案 0 :(得分:1)
您应该使用.//
代替//
。
- // para选择根文档节点的所有para后代,从而选择与上下文节点相同的文档中的所有para元素
- .// para选择上下文节点的para元素后代
http://www.w3.org/TR/xpath20/#abbrev
doc.xpath("//Server").each do |row|
#puts row
puts row["NAME"]
row.xpath(".//state//Transition").each do |idx|
puts "#{idx['INDEX']} #{idx['DATE']}"
end
end
# output
# host1
# 1 2016-06-14
# 2 2016-06-15
# host2
# 1 2016-07-14
# 2 2016-07-15