2016-11-22 66 views
0

我最近有一個問題:我有兩個XML文件,我需要檢查它們是否相等。兩個文件都具有相同種類的元素節點,但順序不同,節點的屬性也相同。就拿這個例子:比較兩個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> 

這是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,否則會出現差異。 (在這個例子中它必須返回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 ; 

以顛倒的順序走節點是至關重要的,否則排序不起作用。

要比較所產生的個XML,我用我的使用老的xmldiff bash腳本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 -)