2つのXMLファイルを比較するにはどうすればよいですか?


75

Linuxでは、2つのXMLファイル間の差分をどのように生成できますか?

理想的には、いくつかの厳密な設定にしたり、空白や属性の順序などのいくつかの設定を緩めたりできるようにしたいと思います。

ファイルが機能的に同じであることをしばしば気にしますが、特にXMLファイルに多くの改行がない場合、diff自体は使用するのが面倒です。

たとえば、次のことは本当に大丈夫です:

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>

回答:


86

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)

1
xmllintの--c14nスイッチについて知らなかった。それは便利です。
qedi 09

18
あなたも1行でそれを行うことができますvimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
ネイサンVillaescusa

およびxmllintはOS Xに同梱されています
ClintM

10
明らかでない場合、c14nはcanonicalizationの略語です。
ブランディン

3
diff-両方のXMLのフォーマット(xmllint --format)の前に追加のステップを実行することをお勧めします。このステップがないと、diffが必要以上の違いを示すことに気付いたからです。
ka3ak 16

23

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ヘッダーを追加します。


18

@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ました。そのため、スクリプトによって追加/削除されたものを確認する必要がありました。
GuruM

1
これは私が必要としたオプションでした。ほとんどの正規バージョンが結合することにより得ることができるはず--format--exc-c14n。おそらく処理がさらに遅くなります:(
ᴠɪɴᴄᴇɴᴛ

答えを書いてからかなり時間が経ちましたが、--exc-c14nフラグを使用したことをかすかに覚えています。ただし、フラグを使用して/使用せずに出力を比較すると違いは見られなかったため、使用を中止しました。不要/未使用のフラグを削除すると、プロセスが高速になる場合があります。
GuruM

5
この--exc-c14nオプションは、属性のソートを指定します。特定のファイルでは、属性はおそらく既にソートされていますが、一般的なアドバイスはの組み合わせを使用すること--format --exc-c14nです。
ᴠɪɴᴄᴇɴᴛ

6

Diffxmlは基本的な機能を正しく取得しますが、多くの構成オプションを提供するようには見えません。

編集:Project Diffxmlは2013年からGitHubに移行されました。


まだ完全ではありませんが、少なくとも有望に見えます。
ケディ09

大きなファイルには有用ではないけれども、〜20Kラインの各2つのファイルを比較するとき、40ギガバイト(RAM + SWAP)を食べた後に死亡
グジェゴシ

そのプロジェクトは、2013年に最後の更新で、死んだように見える注意
はMateusz Konieczny

4

子要素の順序も無視したい場合は、このための簡単なpythonツールを作成しましたxmldiffs

要素と属性の順序を無視して、2つのXMLファイルを比較します。

使用法: xmldiffs [OPTION] FILE1 FILE2

追加のオプションはすべてdiffコマンドに渡されます。

https://github.com/joh/xmldiffsで入手してください


1

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出力を完全に抑制する(終了ステータスを返す)など、出力を制御するためのさまざまなオプションがあります。


0

Beyond Compareを使用し、すべての種類のテキストベースのファイルを比較します。WindowsおよびLinux用のバージョンを作成します。


1
プレーンテキストの比較では、2行が異なっていると言われますが、OPはそれらを同じものとして報告することを望んでいます。
ChrisF

4
すなわち、XMLを標準的に比較します。
クリスW.レア

1
Beyond Compareはこれを本当に嫌になります。XML要素を認識していないようで、ほとんどテキスト比較のみを行っているようです。
ロブK

比較を越えてXMLプラグインを持っているが、私はそれを正しくインストールすることができなかったので... Nyeah ...私は、このページに来て、賢く...だ
Erkの

-1

私たちのSDスマート差分器は、に基づいてドキュメントを比較構造を実際のレイアウトとは対照的です。

XML Smart Differencerがあります。XMLの場合、タグとコンテンツの一致順序を意味します。指定した特定のフラグメントのテキスト文字列が異なっていたことに注意する必要があります。現在、空白が正規化されているか重要であるかを示すタグ属性のXMLの概念を理解していません。


1
SOプロファイルでは、雇用主に関する完全な開示を提供します。私もあなたの答えの中に短い免責事項を好んでいたでしょう:)ところで、私は評価コピーをダウンロードしようとしましたが、リクエストフォームは(JSを介して)スマートディファレンサーとの組み合わせXMLを無効にするのに十分な「スマート」です(後者も) SD製品ページによると、Pythonと組み合わせて使用​​できますか?)
ᴠɪɴᴄᴇɴᴛ14年

1
あ。念押し有難う。これは、これに関する明確なSOポリシーが存在する前の時代からの回答です。SOポリシーに準拠した回答の関係を示すために、回答を修正しています。
アイラバクスター14年

ダウンロードページを確認します。すべてのライブ製品がリストに含まれているわけではありません。はい、これらは存在します。
アイラバクスター14年

ダウンロードページを確認しました。はい、XMLスマートディファレンダーはありません。私はそれを修正するためにバックルームの人に働きかけてもらいます。せいぜい1〜2週間でそこにあるはずです(バックログがあります、私たち全員ではありませんか?)一方で、試してみたい場合は、電子メールを送信します(略歴を参照)。
アイラバクスター

1
リンクされたページには「XML」という単語がありません。
マテウスコニエチュニー

-1

オンラインツール(の依存関係)がソリューションとしてカウントされるかどうかはわかりませんが、それが価値があるものとして、このオンラインXML比較ツールで良い結果を得ました。それは単に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.