2016-11-22 21 views
0

最近問題がありました。私は2つのXMLファイルを持っており、コンテンツと等しいかどうかを確認する必要があります。どちらのファイルも同じ種類の要素ノードを持ちますが、順序は異なりますが、ノードの属性も同じです。この例を見てみましょう:2つのXMLファイルを要素と属性の順序に関係なく比較します

これはfile1.xml

<Car name="Ferrari" speed="420"> 
    <Engine>V12</Engine> 
    <Color name="Red"/> 
</Car> 
<Car name="Lamborghini" speed="380"> 
    <Engine>SV</Engine> 
    <Color name="White"/> 
</Car> 

ですこれは、私がこの2つのファイルを比較して何かを必要とし、彼らは "等しい" の場合にtrueを返しますfile2.xml

<Car speed="380" name="Lamborghini"> 
    <Color name="White"/> 
    <Engine>SV</Engine> 
</Car> 
<Car speed="420" name="Ferrari"> 
    <Color name="Red"/> 
    <Engine>V12</Engine> 
</Car> 

あり、それ以外の場合は、相違点が表示されます。 (この例ではtrueを返す必要があります)

明らかに、これは一例ですが、私が調べなければならないファイルは、50.000 +の要素の中にあります。

私が探しているのは、ソフトウェア、使用するライブラリ、手動アルゴリズムのすべてです。

ありがとうございました。

答えて

1

まず、サンプルを<R> ... </R>にラップして、それらからXMLドキュメントを作成しました。

次に、xshを使用して入力ファイルを正規の要素順序に処理しました。すべての子要素を名前と@name属性でソートしました。

my $F1 := open file1.xml ; 
my $F2 := open file2.xml ; 
my $nodes = ($F1//* | $F2//*) ; 
for my $element in { reverse @$nodes } { 
    if ($element/*) { 
     xmove &{ sort :k concat(name(), '|', @name) $element/* } 
      append $element ; 
    } 
} 

save :f file1.out.xml $F1 ; 
save :f file2.out.xml $F2 ; 

ノードを逆順に移動することは重要です。そうしないと、並べ替えが機能しない可能性があります。

は、私が使用しています私の古いXmlDiffはのbashスクリプトを使用し、その結果XMLSを比較するには xmllint

#!/bin/bash 

a=([email protected]) 
b=$# 
f2=${a[$((--b))]} 
f1=${a[$((--b))]} 
diff "${a[@]:0:$b}" \ 
    <(xmllint --c14n "$f1" |xmllint --format -) \ 
    <(xmllint --c14n "$f2" |xmllint --format -) 
関連する問題