結局、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=たいへん良くできました
大変に亀なコメントですが、、お久しぶりに通りがかりでのご挨拶。(^_^)