Lassen Sie mich zunächst sagen, dass XML-Vergleich ist schwierig. Es ist schwierig, weil Sie XML-Instanzen vergleichen, wie Sie es im Titel Ihrer Frage sehr gut sagen.
XMLs sind nicht nur Inhalte (Textdateien, Binärdateien usw.), die Sie vergleichen können, um festzustellen, ob sich etwas unterscheidet. XML hat eine Bedeutung und verschiedene XML-Instanzen können dieselbe Bedeutung haben.
Betrachten wir zum Beispiel diese XML-Beispiel:
<sample a="foo" b="bar" />
Ist das anders als das?
<sample b='bar' a='foo' />
oder dies:
<sample
a="foo"
b="bar" />
oder sogar ?: diese
<sample a="foo" b="bar"></sample>
Die Antwort ist, dass die Proben alle gleich sind. Aber wenn Sie jedes Hashing durchführen, erhalten Sie jedes Mal andere Hashes.
Wenn Sie XML-Instanzen hashen und den Hash zum Vergleich verwenden möchten, müssen Sie sie zuerst in a canonical form abrufen. Wenn sich die XML-Dateien nicht häufig ändern, können Sie den Hash-Wert neben dem XML-Code speichern und dann Hashwerte vergleichen. Sie berechnen den Nachrichtenauszug nur, wenn sich etwas ändert. Dies kann sehr schnell sein.
Eine andere Lösung wäre auch, an XSLT Transformation zu haben und die zwei XML-Instanzen als Eingabe zu verwenden. Sie geben dann etwas einfacheres aus (vielleicht eine flache Datei mit allen Element- und Attributnamen und -werten), die einfacher zu vergleichen ist.
Es gibt lots of ways to compare XML Dateien und wie @ violet313 im Kommentar erwähnt, kommt es wirklich darauf an, warum Sie einen Vergleich machen wollen und was genau Sie vergleichen möchten.
auf das Risiko, stumpf zu klingen, kommt es wirklich darauf an, warum Sie einen Vergleich machen wollen. zB: Für ein Backup-System, in dem Sie Änderungen aufzeichnen müssen, ist die Übernahme eines Hashes in Ordnung. um nur zu wissen, ob zwei Dateien gleich oder verschieden sind, kann ein Byte-für-Byte-Vergleich sehr schnell sein (oops! erstes Byte ist anders. Stopp hier), während etwas wie [Rabin-Karp] (http: //en.wikipedia. org/wiki/Rabin-Karp_string_search_algorithm) ist O (n) – violet313