Ich habe einmal einen Nachmittag an eine Konfigurationsdatei verloren, die & quot; changed" zwischen zwei Deploys hatte Das Diff in meinem Terminal war eine Wand aus Rot, hunderte von Zeilen, und ich verbrachte eine Stunde damit, nach der wirklichen Änderung zu suchen, bevor ich erkannte, dass die Deploy-Pipeline die Datei neu formatiert hatte: neu eingerückt, ein paar Attribute neu geordnet, einige lange Zeilen neu gewickelt Nicht ein Byte, das einem Parser eigentlich etwas bedeutet hätte, außer ein einzelner Wert, der im Rauschen vergraben war Ein zeilenbasiertes Diff konnte mir das nicht sagen, denn ein zeilenbasiertes Diff versteht XML nicht In diesem Leitfaden geht es darum, XML so zu vergleichen, wie es verdient, mit dem Rauschen XML-Differecker auf Toolz.dev, und warum ein Strukturvergleich die eine Änderung findet, die zählt, anstatt sie in der Formatierung zu ertränken.
tl; dr: Ein XML-Diff vergleicht zwei Dokumente als Knotenbäume, nicht als Textzeilen, sodass das Neueinstellen, Neuordnen von Attributen oder Neuverpacken von Zeilen nicht als Änderung registriert wird Es meldet, welche Elemente, Attribute und Textwerte hinzugefügt, entfernt oder geändert wurden, jeweils an einen Knotenpfad angeheftet Die XML-Differecker Macht das komplett in deinem Browser, ohne dass etwas hochgeladen wurde.
Was ist ein XML-Diff-Checker?
Ein XML-Diff-Checker vergleicht zwei XML-Dokumente und meldet, was sich als Satz struktureller Unterschiede geändert hat: welche Elemente erschienen oder verschwunden sind, welche Werte Attribute geändert haben und wo sich der Textinhalt unterscheidet Anstatt die Dateien Zeile für Zeile zu vergleichen, analysiert er beide in Knotenbäume und vergleicht sie als Daten Sie fügen das Original links, die neue Version rechts ein und erhalten eine Liste von Unterschieden zurück, die jeweils mit dem genauen Pfad im Baum gekennzeichnet sind, in dem es passiert ist.
Der Sinn eines strukturellen Vergleichs ist, dass XML über viele verschiedene Byte-Layouts hinweg dieselbe Bedeutung trägt Die W3 C XML Spezifikation Ist explizit, dass einige Oberflächendetails das analysierte Dokument nicht beeinflussen: Die Reihenfolge der Attribute auf einem Element ist nicht signifikant, und der Leerraum zwischen Elementen ist normalerweise nur Formatierung Zwei Dateien können strukturell identisch sein, während sie sich in Einrückung, Attributreihenfolge, Zeilenenden oder ob ein leeres Element geschrieben wird, unterscheiden als <tag></tag> oder <tag/>. Ein Klartext-Diff markiert all das; Ein Strukturdiff ignoriert es und zeigt nur an, was ein Parser tatsächlich anders lesen würde.
Auf Toolz.dev ist der Workflow kurz Beide Dokumente einfügen, wählen, ob Leerzeichen, Attribute oder Kasus ignoriert werden sollen und drücken Sie Vergleichen Das Tool analysiert beide Bäume und listet jeden Unterschied nach Pfad auf, gruppiert in hinzugefügte, entfernte und geänderte Werte, mit den alten und neuen Werten nebeneinander.
Wie unterscheidet sich ein XML-Diff von einem Text-Diff?
Ein Textdiff, wie er in Git und den meisten Editoren eingebaut ist, vergleicht Dateien als Zeilenfolgen und findet den kürzesten Satz von Einfügungen und Löschungen, der das eine in das andere verwandelt Das ist genau richtig für Quellcode, wo Zeilen sinnvolle Einheiten sind Es ist das falsche Modell für XML, wo Bedeutung im Baum lebt und die Zeilenumbrüche Dekoration sind.
Die Fehlermodi sind vorhersehbar Das Dokument neu einschalten und ein Textdiff markiert fast jede geänderte Zeile neu Ordnen Sie zwei Attribute auf einem Element und es markiert diese Zeile, obwohl das Element identisch mit einem Parser ist Fügen Sie ein einzelnes Kind in der Nähe der Oberseite hinzu und jede Zeile darunter verschiebt sich, sodass das Diff eine Kaskade von Bewegungen zeigt, die sich nicht wirklich ändern Am Ende scannt man Hunderte von markierten Zeilen, um diejenige zu finden, die wichtig ist, nämlich den Nachmittag, den ich oben beschrieben habe.
Ein strukturelles Diff umgeht das alles, indem es zuerst analysiert Es baut aus jedem Dokument einen Baum auf, dann führt es die beiden Bäume zusammen und vergleicht Knoten Formatierungsunterschiede existieren einfach nicht auf Baumebene, so dass sie nicht in der Ausgabe erscheinen können Was bleibt, ist die Menge der Änderungen, die verändern würde, wie sich Software, die das XML verbraucht, verhält, was fast immer die Menge ist, um die Sie sich tatsächlich kümmern Wenn Ihre Daten JSON und nicht XML sind, gilt das gleiche Prinzip und die json diff Tool macht dort den gleichwertigen Strukturvergleich.
Wie entscheidet es, was sich geändert hat?
Der Vergleich erfolgt in drei Schichten an jedem Element, und durch deren Trennung ist die Ausgabe lesbar.
Attribute werden nach Namen verglichen, unabhängig von der Reihenfolge, in der sie im Tag angezeigt werden, da die Attributreihenfolge in XML nicht signifikant ist. Für jedes Element prüft das Tool, welche Attribute auf beiden Seiten vorhanden sind, und meldet ein Attribut als geändert, wenn sein Wert abweicht, hinzugefügt, wenn es nur rechts erscheint, oder entfernt, wenn es nur links erscheint. Neuordnung <a x="1" y="2"/> auf <a y="2" x="1"/> überhaupt keinen Unterschied produziert.
Textinhalt wird als direkter Text jedes Elements verglichen, bei Whitespace-Handling auf werden Leerzeichenläufe und Zeilenumbrüche zusammengebrochen und führender und nachfolgender Leerraum wird beschnitten, so dass durch hübsches Drucken des Dokuments keine Phantomtextänderungen entstehen Es wird nur über eine echte Änderung der Wörter zwischen den Tags berichtet.
Kind-Elemente sind der interessante Teil Elemente, die einen Tag-Namen teilen, werden durch ihre Reihenfolge des Aussehens gepaart: die erste <item> Links wird mit dem ersten verglichen <item> Rechts, die Sekunde zur Sekunde, und so weiter Wenn eine Seite mehr Vorkommen hat als die andere, werden die Extras als hinzugefügt oder entfernt gemeldet, anstatt eine Fehlausrichtung zu erzwingen Diese Ordnungsregel ist es, die eine kleine Änderung in einem wiederholten Element davon abhält, in ein Diff jedes Geschwisters zu kaskadieren.
So stapeln sich die beiden Vergleichsmodelle:
| Aspekt | Textdiff | XML-Diff (strukturell) |
|---|---|---|
| Einheit verglichen | Textzeilen | Knoten in einem Baum |
| Wiedereinweisung | Zeigt sich als Änderungen | Ignoriert |
| Attribut-neuordnung | Zeigt sich als Abwechslung | Ignoriert |
| Meldungen ändern den Standort | Liniennummer | Knotenpfad, z.B. /katalog/buch [2] /@id |
| Unterscheidet Element vs. Attribut vs. Text | kein | ja |
| am besten für | Quelltext, Prosa | XML-Konfiguration, API-Nutzlasten, SVG, Sitemaps |
Ein konkretes Beispiel macht die Schichtung deutlich Nimm einen kleinen Buchkatalog, wo sich zwischen zwei Versionen ein book' s Kategorieattribut von Fiktion zu Mystery ändert, dass sich der gleiche book' s-Preistext von 12,99 auf 14,99 ändert, und das zweite Buch ein neues isbn-Element erhält Ein Liniendiff würde alle drei plus jede etwaige Reindentierung um sie herum durcheinanderwirbeln Das Strukturdiff meldet genau drei Unterschiede: ein verändertes Attribut am Kategorienpfad, ein veränderter Textknoten am Preispfad, und ein hinzugefügtes Element am isbn-Pfad Jedes ist mit seiner Art markiert, sodass man auf einen Blick erkennen kann, dass zwei Edits zu vorhandenen Daten decoding-Differenz waren.
Das Tool gruppiert die Ergebnisse auch in hinzugefügte, entfernte und geänderte Registerkarten mit laufender Zählung, sodass Sie zuerst grobe Fragen beantworten können, wie z. B. & quot; wurde alles gelöscht, & quot; bevor Sie sich mit den Einzelheiten befassen Bei einem großen Dokument kommt es auf diese Reihenfolge an: Entfernungen sind oft die gefährlichste Änderung, da ein heruntergefallenes Element ein erforderliches Feld stillschweigend entfernen kann und die Möglichkeit besteht, sie zu isolieren, ohne durch unabhängige Änderungen zu waten, ist eine echte Zeitersparnis.
Was bedeutet der Knotenpfad in einer Differenz?
Jeder Unterschied ist mit einem Pfad beschriftet, der einem genau angibt, wo im Baum er sitzt, sodass man zu ihm springen kann, anstatt die Datei zu scannen Der Pfad wird aus Elementnamen aufgebaut, verbunden durch Schrägstriche vom Stamm nach unten Wenn ein Element gleichnamige Geschwister hat, wird durch einen einbasierten Index in Klammern eindeutig, welcher, also /catalog/book[2] Ist das zweite Buch Ein Attribut wird mit einem @ Präfix, wie in /catalog/book[1]/@category& eine Textänderung ist gekennzeichnet mit text()(wie in /catalog/book[2]/price/text()drohen
Diese Notation kommt bewusst nahe an XPath3, die W3 C-Sprache für die Adressierung von Knoten in einem XML-Dokument, also wenn Sie XPath bereits lesen, werden sich die Pfade vertraut anfühlen und Sie können oft einen ähnlichen Ausdruck in Ihr eigenes Tooling einfügen, um denselben Knoten auszuwählen Auch ohne XPath zu kennen, lesen sich die Pfade natürlich: Namen gehen den Baum hinunter, Klammern wählen ein Geschwisterchen aus, @ Attribut ist, und text() Inhalt ist.
Weil der Pfad auch die Art der Veränderung benennt, beantwortet der Bericht drei Fragen gleichzeitig: Was hat sich geändert, wo es lebt, und ob es ein Element, ein Attribut oder ein Text war Das reicht in der Regel aus, um die richtige Datei zu öffnen und die richtige Linie ohne weitere Jagd zu fixieren.
Wann würde ich das eigentlich nutzen?
Konfigurationsdrift ist der Fall, den ich am meisten getroffen habe Wenn sich ein Dienst zwischen zwei Umgebungen unterschiedlich verhält und der einzige Verdächtige eine XML-Konfiguration ist, sagt Ihnen der Vergleich der beiden Dateien strukturell in Sekundenschnelle, ob sich ein Wert wirklich geändert hat oder jemand die Datei gerade neu formatiert hat Das Gleiche gilt für den Aufbau und die Bereitstellung von Pipelines, die XML neu schreiben, wobei Sie eine Transformation nur so ändern müssen, wie sie sollte.
API- und Integrationsarbeit ist die nächste. SOAP-Antworten, RSS- und Atom-Feeds sowie ältere REST-APIs sprechen immer noch XML, und wenn eine Nutzlast aufhört, korrekt zu analysieren, bestimmt ein strukturelles Diff anhand eines bekannten guten Beispiels das beleidigende Element schnell. SVG ist auch XML, sodass der Vergleich zweier exportierter Symbole genau zeigt, welchen Pfad oder welches Attribut ein Editor geändert hat. Sitemaps, Android-Layoutdateien, Maven POMs usw .docx Internale sind alle XML unter der Haube, und alle profitieren von der gleichen Behandlung Ich baue quer über den Stapel, und XML taucht in mehr Ecken auf, als die Leute erwarten, weshalb dies neben dem wohnt XML-Formater und XML zu JSON In meinen Lesezeichen Ich skizzierte, wie diese zu einem breiteren Kit passen JSON-zu-XML-Leitfadendrohen
Es gibt auch einen Code-Review-Winkel Wenn eine Pull-Anfrage eine XML-Leuchte oder eine generierte Datei berührt, ist das Rohdiff in der Review-Benutzeroberfläche oft nicht lesbar, weil ein Formatierer das Ganze umgeschrieben hat. Durch einen strukturellen Vergleich das Vorher und Nachher ausführen und dann den kurzen Bericht in die Rezension einfügen, teilt er Ihrem Rezensenten auf einen Blick mit, was sich tatsächlich geändert hat, anstatt ihn aufzufordern, einer roten Wand zu vertrauen. Der Tool's kopierbarer Textbericht existiert genau dafür: eine kompakte Zusammenfassung jedes hinzugefügten, entfernten und geänderten Knotens mit seinen Vorher-Nachher-Werten, bereit, in ein Ticket, eine Commit-Nachricht oder einen Chat-Thread zu fallen.
Die benachbarten Vergleichstools decken die Fälle ab, in denen XML diff nicht. Wenn Ihre Daten tabellarisch sind, wird die CSV-Diff Vergleicht Zeilen und Zellen und für zwei einfache Listen die Liste vergleichen Werkzeug setzt Unterschiede Sie teilen die gleiche Philosophie: Analysieren Sie die Daten zuerst in ihre natürliche Form, vergleichen Sie sie dann, sodass das Diff eher die Bedeutung als das Layout widerspiegelt.
Wo liegen die Grenzen und ist mein XML privat?
Das Tool vergleicht Struktur, was bedeutet, dass es bewusst nicht die Art von Unterschieden meldet, die Struktur nicht erfasst Das Neuordnen von zwei Attributen, das Ändern von Einrückungen oder das Vertauschen der selbstschließenden Syntax werden alle als keine Änderung behandelt, vom Design her Wenn Ihr Anwendungsfall wirklich einen Byte-exakten Vergleich benötigt, ist ein Textdiff das richtige Werkzeug und das ist nicht Der Strukturdiff paart auch wiederholte Elemente nach Position, sodass das Tool, wenn dieselben Datensätze in eine andere Reihenfolge gemischt werden, die verschobenen als geändert und nicht verschoben ansieht; Wenn das Sinn ergibt, erhält das Sortieren beider Dokumente zuerst mit einer stabilen Taste das sauberste Ergebnis.
Malformed XML wird gemeldet, anstatt erraten zu werden Wenn ein Dokument ein nicht übereinstimmendes oder nicht geschlossenes Tag oder mehr als ein Wurzelelement hat, benennt das Tool das Problem und sagt Ihnen, von welcher Seite es stammt, sodass Sie nie ein irreführendes Diff aus einer gebrochenen Eingabe erhalten Es verarbeitet die gängigen realen Konstrukte, die ein Parser benötigt: Attribute in einfachen oder doppelten Anführungszeichen, selbstschließende Tags, CDATA-Abschnitte, Kommentare, Verarbeitungsanweisungen und Standard-Entitätsreferenzen wie < und &drohen
Zum Datenschutz läuft alles in Ihrem Browser Beide Dokumente werden lokal geparst und verglichen, und nichts wird hochgeladen, protokolliert oder gespeichert Das ist die Eigenschaft, die es sicher macht, eine Produktionskonfiguration, eine interne API-Nutzlast oder eine kundenspezifische Datei zu verbreiten, von denen keine auf einen fremden & #39; s-Server gehört Datenschutz in Online-Tools Der Leitfaden erklärt, wie Sie überprüfen können, ob ein Tool wirklich clientseitig ist. Dies lohnt sich, bevor Sie etwas Empfindliches in ein Web-Tool einfügen.
Häufig gestellte Fragen
Wie vergleiche ich zwei XML-Dateien?
Fügen Sie das ursprüngliche XML in das erste Feld und das geänderte XML in das zweite ein, und drücken Sie dann Vergleichen Das Tool analysiert beide in Knotenbäume und listet jedes hinzugefügte, entfernte und geänderte Element, Attribut und Textwert auf, die jeweils an seinen Knotenpfad angeheftet werden Es wird nichts hochgeladen.
Wie unterscheidet sich ein XML-Diff von einem Klartext-Diff?
Ein Textdiff vergleicht Dateien Zeile für Zeile, sodass durch das erneute Einrücken, Neuordnen von Attributen oder Umwickeln von Zeilen fast alles verändert aussieht Ein XML-Diff analysiert beide Dokumente zuerst in Bäume und vergleicht sie strukturell, sodass nur Unterschiede gemeldet werden, die die Art und Weise ändern würden, wie ein Parser das Dokument liest.
Zählt das Neuordnen von Attributen als Änderung?
Nr. Attribute werden unabhängig von der Reihenfolge, in der sie im Tag erscheinen, namentlich verglichen, da die Attributreihenfolge in XML nicht signifikant ist Es wird nur ein geänderter Wert, ein hinzugefügtes Attribut oder ein entferntes Attribut gemeldet.
Wie werden wiederholte Elemente zwischen den beiden Dokumenten abgeglichen?
Untergeordnete Elemente, die einen Tag-Namen teilen, werden nach ihrer Reihenfolge des Auftretens gepaart, so wird das erste Element mit dem ersten Element verglichen, das zweite mit dem zweiten und so weiter, Wenn ein Dokument mehr Vorkommen hat als das andere, werden die Extras als hinzugefügt oder entfernt gemeldet.
Was bedeutet der Knotenpfad in jeder Differenz?
Der Pfad zeigt an, wo im Baum die Änderung ist, indem Elementnamen, ein einbasierter Index in Klammern verwendet werden, wenn es Geschwister gleichen Namens, @name für ein Attribut und Text () für Textinhalte gibt. Zum Beispiel zeigt /katalog/book [2] /@id auf das id-Attribut des zweiten Buches.
Beeinflusst Leerzeichen oder Formatierung den Vergleich?
Standardmäßig wird Text, der nur Leerzeichen hat, ignoriert und Leerzeichenläufe im Text werden zusammengebrochen, sodass durch die Neuformatierung des Dokuments keine falschen Unterschiede entstehen. Sie können sich auf den strukturellen Vergleich verlassen, anstatt die Einrückung genau abzugleichen.
Was passiert, wenn das XML fehlerhaft ist?
Das Tool meldet einen eindeutigen Fehler bei der Benennung des Problems, z. B. ein nicht übereinstimmendes oder nicht geschlossenes Tag, und sagt Ihnen, aus welchem Dokument es stammt. Es wird nicht auf eine Reparatur getippt, sodass Sie aufgrund einer fehlerhaften Eingabe nie ein irreführendes Diff erhalten.
Werden meine XML-Dokumente irgendwo hochgeladen?
Nein. Alle Parsing und Vergleiche geschehen als JavaScript in Ihrem Browser Es wird nichts übertragen, protokolliert oder gespeichert. Sie können dies bestätigen, indem Sie den Netzwerk-Tab ansehen oder indem Sie die Verbindung zum Internet trennen, das Tool funktioniert weiterhin offline.
Vergleichen Sie Ihre eigenen Dokumente mit den kostenlosen XML-Differecker. Es meldet strukturelle Unterschiede nach Knotenpfad, vollständig in Ihrem Browser, ohne dass etwas hochgeladen wurde.



