XMLを小綺麗にして比較

結局、XMLは文字列なんだから小綺麗にフォーマットして文字列比較でいいぢゃないか。

ということに気がついた。以下は例…

  • test1.xmlとtest2.xmlを準備した。
  • test2.xmlはちょっと形式を汚くしたもの。(ムダな空白を入れた)
  • 単純切り出しだと比較はNGになる
  • フォーマットした文字列を比較すれば同一として判断される

⬜︎test1.xml


    
        bbb1
        bbb2
        bbb3
        ccc1
    
    
        bbb4
        bbb5
    
    

⬜︎test2.xml


    
        bbb1
            bbb2
        bbb3
        ccc1
    
    
        bbb4
        bbb5
    
    

⬜︎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")

フォーマット前だと別文字列となったが、フォーマットしたら同じ文字列と判断された。

これで比較はいいぢゃんと思った。