Command Palette

Search for a command to run...

XML 差分: 2 つの XML ファイルを行ではなく構造で比較します

XML 差分: 2 つの XML ファイルを行ではなく構造で比較します

T
Toolz Team
|Aug 23, 2026|15 分読んでください

差分と比較 コレクションの一部

2 つのデプロイ間で "changed" という設定ファイルに午後を一度失いました。 私の端末の diff は何百行もの赤い壁で、deploy パイプラインがファイルを再フォーマットしたことに気づく前に、実際の変更を探して 1 時間を費やしました。 reindented it, reordered a some attributes, rewrapped some long lines. not one byte that a parser would care about had actually changed, except the single value buryed in the noise.行ベースの diff は、XML を理解していないため、それを教えてくれませんでした。 このガイドは、XML を比較するのに値する方法で比較することについてです XML 差分チェッカー Toolz.dev で、構造比較で重要な変更がフォーマットに埋もれるのではなく見つかる理由を説明します。

tl;dr: XML diff は、2 つの文書をテキスト行としてではなく、ノードツリーとして比較するため、再インデント、属性の並べ替え、または行の再ラッピングは変更として登録されません。 どの要素、属性、およびテキスト値が追加、削除、または変更され、それぞれがノードパスに固定されたかを報告します。 XML 差分チェッカー これはすべてブラウザで実行され、アップロードされるものは何もありません。

XML diff チェッカーとは何ですか?

XML diff チェッカーは、2 つの XML ドキュメントを比較し、何が変化したかを一連の構造的な違いとして報告します: どの要素が現れたか消えたか、どの属性が値を変えたか、テキストの内容を行ごとに比較するのではなく、両方をノード ツリーに解析してデータとして比較します。左側にオリジナル、右側に新しいバージョンを貼り付け、違いのリストを取り戻します。それぞれ、それが起こったツリー内の正確なパスでラベル付けされます。

構造比較のポイントは、XML が多くの異なるバイトレイアウトにわたって同じ意味を運ぶということです。 the W3C XML仕様 は、一部のサーフェスの詳細が解析されたドキュメントに影響を与えないことを明示しています: 要素上の属性の順序は重要ではなく、要素間の空白は通常、単に書式設定を行うだけで、2 つのファイルは構造的に同一であっても、インデント、属性の順序、行末、または空の要素が次のように記述されているかどうかが異なります <tag></tag><tag/>。プレーン テキストの差分は、そのすべてにフラグを立てます。構造差分はそれを無視し、パーサーが実際に何を異なる読み方をするかのみを示します。

Toolz.dev ではワークフローが短いです。両方のドキュメントを貼り付け、空白、属性、大文字と小文字を無視するかどうかを選択し、「比較」を押します。ツールは両方のツリーを解析し、すべての違いをパスごとにリストし、古い値と新しい値を並べて追加、削除、変更にグループ化します。

XML 差分はテキスト差分とどのように異なりますか?

Gitやほとんどのエディタに組み込まれている種類の テキスト差分は ファイルを一連の行として比較し 最短の挿入と削除のセットを見つけ 一方を他方に変えます これはまさにソースコードに対して正しいことです 行が意味のある単位であり 意味が木に宿り 改行が装飾である XMLにとっては 間違ったモデルです。

失敗モードは予測可能です ドキュメントを再度インデントし テキストの差分は 変更されたほぼすべての行をマークします 1 つの要素に2 つの属性を並べ替えると 要素がパーサーと同一であっても その行にフラグが立てられます 上部近くに1 つの子を追加し その下の行はすべてシフトします そのため差分は 実際には変更されない動きのカスケードを示します フラグが付けられた行を何百もスキャンして 重要なものを見つけます これは上で説明した午後です。

構造差分は、最初に解析することでそのすべてを回避します。各ドキュメントからツリーを構築し、次にノードを比較しながら 2 つのツリーを一緒に歩みます。書式設定の違いはツリー レベルには存在しないため、出力に表示できません。残っているのは、XML を消費するソフトウェアの動作を変更する一連の変更です。これは、ほとんどの場合、実際に気にかけているセットです。データが XML ではなく JSON の場合、同じ原則が適用されます json 差分 ツールはそこで同等の構造比較を行います。

何が変わったのかはどのように決まるのでしょうか?

比較は各要素で 3 つの層に分けて行われ、それらを分離することで出力が読みやすくなります。

属性は、タグに表示される順序とは無関係に、名前で比較されます。 、XMLでは属性の順序が重要ではないためです。ツールは要素ごとに、両側にどの属性が存在するかをチェックし、値が異なるときに変更された属性、右側のみに表示されるときに追加された属性、または左側のみに表示されるときに削除された属性を再順序付けします <a x="1" y="2"/> にする <a y="2" x="1"/> 違いはまったくありません。

テキスト内容は各要素の直接テキストとして比較されます。 whitespace 処理をオンにすると、スペースと改行の実行が折りたたまれ、先頭と末尾の空白がトリミングされるため、ドキュメントをきれいに印刷しても、ファントム テキストの変更は作成されません。 tags 間の単語に対する本物の変更のみが報告されます。

子要素は興味深い部分です タグ名を共有する要素は、出現順: 最初の順でペアになります <item> 左側は最初のものと比較されます <item> 右側、2 番目から 2 番目まで、というように、一方の側が他の側よりも多くの出現がある場合、余分なものは強制的に位置ずれするのではなく、追加または削除として報告されます。この順序付けルールは、1 つの繰り返し要素の小さな変化がすべての兄弟の差分にカスケードするのを防ぐものです。

2 つの比較モデルがどのように積み重なるかは次のとおりです:

アスペクト テキスト差分 XML diff (構造)
単位の比較 テキスト行 木の中のノード
再インデント 変化として示す 無視
属性の並べ替え 変化として示されます 無視
レポートは場所を変更します ライン番号 ノードパス、例えば /catalog/book [2] /@id
要素と属性 vs テキストを区別します いやー はいって
に最適 ソースコード、散文 XML コンフィグ、API ペイロード、SVG、サイトマップ

具体的な例でレイヤリングを明確にします。 2 つのバージョンの間で、1 つの book&#39;s カテゴリ属性がフィクションからミステリーに変更される小さな書籍カタログを取り上げます。同じ book&#39;s 価格テキストが 12.99 から 14.99 に変更され、2 番目の書籍に新しい isbn 要素が追加されます。 line diff は 3 つすべてにフラグを立て、その周りに再インデントを付けてごちゃ混ぜにします。 structural diff は、カテゴリ パスで変更された属性、価格パスで変更されたテキスト ノード、isbn パスで追加された要素の 3 つの違いを正確に報告します。それぞれに種類がタグ付けされているため、2 つは既存のデータを編集したもの、もう 1 つは本物の追加だったことが一目でわかります。その分離が、レポートを読むこととレポートをデコードすることの違いです。

このツールはまた、実行中のカウントで結果を追加、削除、および変更したタブにグループ化するため、最初に &quot; did anything get deleted, &quot; などの粗い質問に答えることができます。詳細をドリルインする前に、大きなドキュメントでは、この順序付けが重要です。削除は多くの場合、最も危険な変更です。これは、ドロップされた要素が必要なフィールドを静かに削除でき、無関係な編集をせずに削除できるため、リアルタイムの節約になります。

差分内のノードパスは何を意味しますか?

すべての差分には、ツリー内のどこにあるかを正確に示すパスでラベルが付けられているため、ファイルをスキャンする代わりにそこにジャンプできます。パスは要素名から構築され、ルートから下のスラッシュで結合されます。要素に同じ名前の兄弟がある場合、括弧内の 1 ベースのインデックスはどれを明確にするので、 /catalog/book[2] は2 冊目です。 an attribute is written with an @ 接頭辞、のように /catalog/book[1]/@category、およびテキスト変更がマークされています text()、 のように /catalog/book[2]/price/text()

この表記は意図的に に近いものになっています Xパス、XML ドキュメント内のノードをアドレス指定するための W3C 言語、ですから、すでに XPath を読んでいる場合、パスは馴染みのあるものに感じられ、同じノードを選択するために、よく似た表現を自分のツールに貼り付けることができます XPath を知らない場合でも、パスは自然に読み取られます: 名前はツリーを下り、ブラケットは兄弟を選択します @ は属性であり、かつ text() は 内容.

パスは変更の種類にも名前を付けているため、レポートでは、何が変更されたのか、どこに住んでいるのか、要素なのか、属性なのか、テキストなのかという 3 つの質問に一度に答えます。通常、これで適切なファイルを開いて、それ以上の追及を行わずに適切な行を修正するのに十分です。

これを実際に使うのはいつでしょうか?

設定ドリフトは私が最もヒットしたケースです。サービスが 2 つの環境間で異なる動作をし、XML 設定だけが疑わしい場合、2 つのファイルを構造的に比較すると、値が本当に変更されたのか、それとも誰かがファイルを再フォーマットしただけなのかが数秒でわかります。 XML を書き換えるパイプラインを構築およびデプロイする場合も同様で、変換が本来あるべきものだけを変更したことを確認する必要があります。

APIと統合の作業が次です。 SOAP応答、RSSとAtomフィード、古いREST APIはまだXMLを話し、ペイロードが正しく解析を停止すると、既知の良いサンプルに対する構造差分が問題となる要素を高速にピンポイントで特定します。 SVGもXMLであるため、エクスポートされた2 つのアイコンを比較すると、エディターがどのパスまたは属性を変更したかが正確に表示されます。 サイトマップ、Androidレイアウトファイル、Maven POM、および .docx 内部はすべてボンネットの下に XML があり、すべて同じ処理から恩恵を受けます。私はスタック全体に構築し、XML は人々が期待するよりも多くの隅に表示されます。そのため、これは の隣に住んでいます XML フォーマッタ あんど XML から JSON へ ブックマークで。 私はこれらがどのように広いキットにフィットするかをスケッチしました JSON から XML ガイド

コードレビューの角度もあります。 pull request が XML フィクスチャや生成されたファイルに触れると、レビュー UI の生の差分が読めないことがよくあります。 before と after を構造比較で実行し、短いレポートをレビューに貼り付けると、レビュー担当者に赤い壁を信頼するように求める代わりに、実際に何が変わったかを一目でわかります。 tool&#39;s コピー可能なテキスト レポートは、まさにそのために存在します。追加、削除、変更されたすべてのノードのコンパクトな概要と、その前後の値を使用して、チケット、コミット メッセージ、またはチャット スレッドにドロップする準備ができています。

隣接する比較ツールは、XML diff がカバーしないケースをカバーします。データが表形式の場合、 CSV差分 行とセルを比較し、2 つのプレーン リストについて リスト 比較 ツールは違いを設定します。これらは同じ哲学を共有しています。最初にデータを自然な形状に解析し、次に比較するため、差分はレイアウトではなく意味を反映します。

制限は何ですか?また、XML は非公開ですか?

ツールは構造を比較します つまり構造で捕捉されない種類の違いを 意図的に報告しないということです 2 つの属性の並べ替え インデントの変更 自己閉じる構文の交換は 全て変更なしとして扱われます 設計上 ユースケースが本当にバイト精密な比較が必要な場合 テキスト差分は適切なツールであり これはそうではありません 構造差分は繰り返される要素も位置ごとにペアにするので 同じレコードが異なる順序にシャッフルされると ツールは移動したものを移設ではなく変更したものと見なします; 最初に安定したキーで両方のドキュメントを並べ替えると、それが理にかなっている場合、最もきれいな結果が得られます。

不正な形式の XML は、推測されるのではなく報告されます 文書に不一致または閉じられていないタグ、または複数のルート要素がある場合、ツールは問題に名前を付け、それがどちらから来たのかを示すため、壊れた入力から誤解を招く差分を取得することはありません 一般的な現実世界の構築物を処理します パーサーは必須です: シングルまたはダブルクォートの属性、自己閉じるタグ、CDATA セクション、コメント、処理命令、および次のような標準エンティティ参照 &lt; あんど &amp;

プライバシーでは、すべてがブラウザで実行されます 両方のドキュメントはローカルで解析および比較され、アップロード、ログ記録、または保存されるものは何もありません。これは、本番構成、内部 API ペイロード、または顧客固有のファイルを安全に差分できるようにするプロパティであり、これらはいずれも stranger&#39; s サーバーに属しません オンライン ツールのデータ プライバシー ガイドでは、ツールが真にクライアント側であることを確認する方法について説明します。これは、機密性の高いものを Web ツールに貼り付ける前に行う価値があります。

よくある質問

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

元の XML を最初のフィールドに貼り付け、変更された XML を 2 番目のフィールドに貼り付け、比較を押します。ツールは両方をノード ツリーに解析し、追加、削除、変更されたすべての要素、属性、およびテキスト値をリストし、それぞれがそのノード パスに固定されたものはアップロードされません。

XML 差分はプレーン テキスト差分とどのように異なりますか?

テキスト差分はファイルを一行ずつ比較するため、再インデント、属性の並べ替え、または行の再ラップにより、ほとんどすべての見栄えが変わります。 XML 差分は、最初に両方のドキュメントをツリーに解析し、構造的に比較するため、パーサーによるドキュメントの読み取り方法を変更する差異のみを報告します。

属性の並べ替えは変更としてカウントされますか?

いいえ 属性は、タグに表示される順序に関係なく、名前で比較されます。これは、XML では属性の順序が重要ではないためです。変更された値、追加された属性、または削除された属性のみが報告されます。

2 つのドキュメント間で繰り返される要素はどのように照合されますか?

タグ名を共有する子要素は出現順で対になっているので、最初の項目は最初の項目と比較され、2 番目は 2 番目と比較され、次のようになります。一方のドキュメントが他方のドキュメントよりも多くの出現数を持っている場合、追加または削除として報告されます。

各差分のノードパスは何を意味しますか?

パスは、ツリー内のどこに変更があるかを示し、要素名を使用して、同じ名前の兄弟がいる場合は括弧内の 1 ベースのインデックス、属性の場合は @name、テキスト コンテンツの場合は text() を示します。たとえば、/catalog/book [2]/@id は 2 冊目の本の id 属性を指します。

空白や書式設定は比較に影響しますか?

デフォルトでは、空白のみのテキストは無視され、テキスト内の空白の実行は折りたたまれます。そのため、ドキュメントを再フォーマットしても誤った差異は生じません。インデントを正確に一致させるのではなく、構造比較に頼ることができます。

XML が不正な形式になっている場合はどうなりますか?

このツールは、タグが一致しない、閉じられていないなど、問題の名前を明らかにエラーとして報告し、それがどの文書から来たのかを通知します。修復を推測するものではないため、壊れた入力から誤解を招く差分を取得することはありません。

XML ドキュメントはどこにでもアップロードされていますか?

いいえ すべての解析と比較はブラウザのJavaScriptとして行われます 何も送信、ログ、保存されません ネットワークタブを見るか、インターネットから切断することでこれを確認できます ツールはオフラインで動作し続けます。


自分の書類と無料書類を比較してください XML 差分チェッカー。ノード パスごとの構造の違いを、すべてブラウザで報告し、何もアップロードしません。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!