結局、XMLは文字列なんだから小綺麗にフォーマットして文字列比較でいいぢゃないか。
ということに気がついた。以下は例…
- test1.xmlとtest2.xmlを準備した。
- test2.xmlはちょっと形式を汚くしたもの。(ムダな空白を入れた)
- 単純切り出しだと比較はNGになる
- フォーマットした文字列を比較すれば同一として判断される
⬜︎test1.xml
<root> <a name="a1"> <b>bbb1</b> <b>bbb2</b> <b>bbb3</b> <c>ccc1</c> </a> <a> <b>bbb4</b> <b>bbb5</b> </a> <a name="a3" price="100"></a> </root>
⬜︎test2.xml
<root> <a name="a1"> <b>bbb1</b> <b>bbb2</b> <b>bbb3</b> <c>ccc1</c> </a> <a> <b>bbb4</b> <b>bbb5</b> </a> <a name="a3" price="100"></a> </root>
⬜︎Rubyスクリプト
require 'rexml/document'
require 'stringio'
default_formatter = REXML::Formatters::Pretty.new
doc1 = REXML::Document.new(open("test1.xml"))
doc2 = REXML::Document.new(open("test2.xml"))
puts "#test1.xml------------------"
puts doc1.elements['root/a[1]']
puts "----------------------------"
output1 = StringIO.new
default_formatter.write(doc1.elements['root/a[1]'], output1)
puts output1.string
puts "----------------------------"
puts "#test2.xml------------------"
puts doc2.elements['root/a[1]']
puts "----------------------------"
output2 = StringIO.new
default_formatter.write(doc2.elements['root/a[1]'], output2)
puts output2.string
puts "----------------------------"
puts "non-formatted : " + (doc1.elements['root/a[1]'] == doc2.elements['root/a[1]'] ? "OK" : "NG")
puts "formatted : " + (output1.string == output2.string ? "OK" : "NG")
フォーマット前だと別文字列となったが、フォーマットしたら同じ文字列と判断された。
これで比較はいいぢゃんと思った。
コメント
ttp://taihenyokudekimashita.quoit.jp/?text=たいへん良くできました
大変に亀なコメントですが、、お久しぶりに通りがかりでのご挨拶。(^_^)