適切なアプローチは、次の2つの要因によって異なります。
(a)比較がどのように行われるかをどの程度制御したいですか?たとえば、空白が重要かどうか、コメントを無視するかどうか、名前空間プレフィックスを無視するかどうか、冗長な名前空間宣言を無視するかどうか、XML宣言を無視するかどうかを制御する必要がありますか?
(b)どのような答えが欲しいですか?(i)ブール値:同じ/異なる、(ii)人間が処理するのに適した違いのリスト、(iii)アプリケーションが処理するのに適した違いのリスト。
私が使用する2つの手法は、次のとおりです。(a)両方のファイルをCanonical XMLに変換してから、文字列を比較します。これはほとんど制御を与えず、ブール結果を与えるだけです。(b)XPath 2.0のdeep-equal()関数または拡張Saxonバージョンのsaxon:deep-equal()を使用して2つのツリーを比較します。Saxonバージョンでは、比較の実行方法をより細かく制御でき、見つかった違いのより詳細なレポートが提供されます(アプリケーションでの使用ではなく、人間が読むため)。
もちろん、Javaコードを記述したい場合は、独自の比較ロジックを実装することもできます。たとえば、XPathのオープンソース実装をディープイコールで見つけて、要件を満たすように変更することができます。たった100行ほどのコードです。