nokogiri xml没有按我想要的方式解析

时间:2016-06-18 05:52:47

标签: ruby

我正在尝试在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

1 个答案:

答案 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