XMLを小綺麗にして比較

結局、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")

フォーマット前だと別文字列となったが、フォーマットしたら同じ文字列と判断された。
これで比較はいいぢゃんと思った。

コメント

  1. kbxstyle より:

    ttp://taihenyokudekimashita.quoit.jp/?text=たいへん良くできました
    大変に亀なコメントですが、、お久しぶりに通りがかりでのご挨拶。(^_^)