2016-06-18 4 views
0

私はここで質問のために簡略化されたxmlの下に印刷しようとしています。 私はそれが私が望むようにそれを印刷するのに苦労します。 以下の正しい出力を誰でも手助けできますか?ノコギリxmlは私が望むように解析されていません

ここにすべての詳細があります StackOverflowエラーメッセージ:あなたの投稿は主にコードであるようです。あなたが.//代わりの//使用する必要がありますいくつかの詳細

# 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

を追加してください。

  • // 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 
+0

scorix、ありがとうございます。それは今働く – Jon

関連する問題