回答:
1つのアプローチは最初に両方のXMLファイルをCanonical XMLに変えて、を使用して結果を比較するでしょうdiff
。たとえば、xmllintを使用してXMLを正規化できます。
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
またはワンライナーとして。
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Jukkaの答えは私にはうまくいきませんでしたが、Canonical XMLを指し示していました。どちら--c14nも--c14n11は属性をソートし、しかし、私は見つけたの--exc-C14Nのスイッチがソート属性をしました。 --exc-c14nはmanページにはリストされていませんが、コマンドラインでは「W3C排他的標準形式」と説明されています。
$ xmllint --exc-c14n one.xml > 1.xml
$ xmllint --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml
$ xmllint | grep c14
--c14n : save in W3C canonical format v1.0 (with comments)
--c14n11 : save in W3C canonical format v1.1 (with comments)
--exc-c14n : save in W3C exclusive canonical format (with comments)
$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686
$ cat /etc/system-release
CentOS release 6.5 (Final)
警告--exc-c14n はxmlヘッダーを削除しますが、-c14nはxmlヘッダーがない場合にxmlヘッダーを追加します。
@Jukka Matilainenの答えを使用しようとしましたが、空白に問題がありました(ファイルの1つは巨大なワンライナーでした)。使用--format
すると、空白の違いをスキップできます。
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
注:vimdiff
コマンドを使用して、xmlを並べて比較します。
two.xml
から生成されone.xml
ました。そのため、スクリプトによって追加/削除されたものを確認する必要がありました。
--format
で--exc-c14n
。おそらく処理がさらに遅くなります:(
--exc-c14n
オプションは、属性のソートを指定します。特定のファイルでは、属性はおそらく既にソートされていますが、一般的なアドバイスはの組み合わせを使用すること--format --exc-c14n
です。
子要素の順序も無視したい場合は、このための簡単なpythonツールを作成しましたxmldiffs
。
要素と属性の順序を無視して、2つのXMLファイルを比較します。
使用法:
xmldiffs [OPTION] FILE1 FILE2
追加のオプションはすべて
diff
コマンドに渡されます。
XMLファイルを比較するためのPythonスクリプトxdiff.pyは、空白または属性の順序の違いを無視します(要素の順序とは対照的)。
2つのファイル1.xml
とを比較2.xml
するには、次のようにスクリプトを実行します。
xdiff.py 1.xml 2.xml
OPの例では、何も出力せず、終了ステータスを返します0
(構造上またはテキスト上の違いがない場合)。
1.xml
および2.xml
が構造的に異なる場合、GNU diffの統一された出力を模倣し、終了ステータスを返します1
。-a
すべてのコンテキスト-n
を出力する、コンテキストを出力しない、-q
出力を完全に抑制する(終了ステータスを返す)など、出力を制御するためのさまざまなオプションがあります。
Beyond Compareを使用して、すべての種類のテキストベースのファイルを比較します。WindowsおよびLinux用のバージョンを作成します。
私たちのSDスマート差分器は、に基づいてドキュメントを比較構造を実際のレイアウトとは対照的です。
XML Smart Differencerがあります。XMLの場合、タグとコンテンツの一致順序を意味します。指定した特定のフラグメントのテキスト文字列が異なっていたことに注意する必要があります。現在、空白が正規化されているか重要であるかを示すタグ属性のXMLの概念を理解していません。
オンラインツール(の依存関係)がソリューションとしてカウントされるかどうかはわかりませんが、それが価値があるものとして、このオンラインXML比較ツールで良い結果を得ました。それは単に機能します。