Ich habe mehrere XMl-Diff-Tools ausprobiert. Hier ist die Zusammenfassung (die Anforderung, die mich dazu veranlasste, es zu testen, war, die von Visual Studio generierten .resx
Ressourcendateien, was meiner Meinung nach ein großer Fehler von Microsoft ist - die Reihenfolge der Elemente ist zufällig, und Windows Forms schreibt den ImageStream immer neu, wenn Sie nur die Position einer Schaltfläche ändern und nichts mit der imageList machen).
- XmlDiff
- Araxis
- Altova DiffDog
- XML-Notepad
- ExamXML
- Liquid XML Studio 2009 (Es gibt ein XML-Diff-Menü, aber nur eine Lizenzversion kann es nutzen. Ich habe also keine Möglichkeit, es auszuprobieren)
Zunächst einmal sollten alle normalen Diff-Tools nicht in Betracht gezogen werden, da sie nichts über XML wissen, sondern Textdateien nur als Textzeilen behandeln.
-
XmlDiff ist das erste Tool, das ich ausprobiert habe. Es sieht so aus, dass es tun kann, was ich brauche, aber nach dem Herunterladen des Quellcodes ( Visual Studio 2003 ) und kompiliert mit Visual Studio 2005 (mit einem erfolgreichen Auto-Upgrade) kann ich das kleine Projekt reibungslos kompilieren. Aber wenn ich zwei echte Projekte vergleiche .resx
Dateien (1295 Zeilen) stürzte er ab. Das Debuggen des Codes gibt mir keinen Aufschluss darüber, was passiert ist, da ich keinen Quellcode der xmldiffpatch.dll XmlDiffPatch.View.dll
.
Der Grund, warum ich mich nicht näher mit diesem Tool befasst habe, war das Ausgabeformat bzw. die Gestaltung der Benutzeroberfläche. Es gibt eine HTML-Datei mit hervorgehobenen Unterschieden in einem vom Internet Explorer gehosteten Fenster aus. Für einen großen XML-Dateidiff ist es nicht einfach zu benutzen.
-
XML Notepad verfügt über einen einfachen integrierten XML-Diff. Dem Ausgabefenster nach zu urteilen, verwendet es intern die Komponente von XmlDiff. Und die Ausgabe ist die gleiche wie bei XmlDiff. Ich werde es deinstallieren.
-
Araxis ist viel mehr ein traditionelles Textvergleichswerkzeug, es kann auch Binärdateien, Bilddateien, Ordner und Worddateien vergleichen. Ich mag es sehr für jede diff Aufgabe außer XML, da es keine XML-kompatiblen Diff-Optionen unterstützt.
-
Altova DiffDog sieht wie ein kompliziertes kommerzielles Produkt aus und enthält eine Option zum Ignorieren der Elementreihenfolge, was für mich die wichtigste Funktion ist.
Aber nachdem ich es mit denselben echten .resx
Datei (1295 Zeilen, meiner Erfahrung nach keine große Datei) habe ich festgestellt, dass die Funktion "Elementreihenfolge ignorieren" nicht gut funktioniert, wenn sich die beiden Elemente an sehr unterschiedlichen Stellen in den beiden Dateien befinden.
-
ExamXML sieht aus wie ein kommerzielles Produkt, aber es ist ein kleines Produkt. Aber nachdem ich es ausprobiert hatte, stellte ich fest, dass es derzeit das idealste Werkzeug für meine Erwartungen ist.
Es gibt auch eine enttäuschende Seite: Es stürzte ab, als ich auf F10 um zum nächsten Unterschied zu navigieren. Die Reihenfolge der Elemente ignorieren Option funktioniert gut. Es ist schade, dass die Anpassung der ignorierten Element ist nicht so viel flexibel.
label1.Size
label1.Location
label1.Width
Ich möchte alle Unterschiede bei diesen Elementen ignorieren, deren Name ".Size" oder ".Location" oder ".Width" enthält, aber es ist nicht möglich, eine solche Bedingung gleichzeitig zu definieren. Die Anpassung unterstützt keine regulären Ausdrücke.
Wie auch immer, ich werde ExamXML (mit Vorsicht) verwenden, um XML-Dateien zu vergleichen.
UPDATE 1: Jahre vergangen, jetzt benutze ich VS2017 und winform nicht seit meiner ersten Antwort auf diese Frage ändern. Wenn die Arbeit brauchen, um auf verschiedene Menschen zu brechen, dieses Problem tauchte wieder und wieder, langweilig mich.
Eigentlich habe ich diese Antwort vergessen, Google hat mich hierher gebracht.
Ich habe eine neue Untersuchungssitzung begonnen und habe einige gute Ergebnisse erzielt: https://www.codeproject.com/Articles/37022/Solving-the-resx-Merge-Problem zeigt, wie schnell wir die resx-Datei mit LINQ nach dem Attribut data/@name sortieren können. Es ist erstaunlich. Der Kerncode ist nur eine Anweisung, die aus mehreren LINQ.
Dann fand ich auch, dass ResXResourceManager, die durch eine andere Antwort in diesem Thread hingewiesen wird, antwortete der Autor auf die oben genannten Code-Projekt Artikel und fügen Sie die Funktion zu ResXResourceManager, in ResxResourceManager, können Sie das Plugin konfigurieren, um automatisch die resx-Datei sortieren, wenn (vor) Sie es in der Konfiguration Registerkarte speichern. Es gibt sogar eine Sortieroption, die Sie auswählen können: CurrentCulture, Ordinal oder IgnoreCase usw.
Leider liefern die Code-Project-Lösung und die ResXResourceManager-Lösung unterschiedliche Ergebnisse. Ich habe herausgefunden, dass die Code-Project-Lösung den Wert des Attributs ">>" als normalen Text behandelt, so dass semantisch verwandte Widgets getrennt werden. Dies kann leicht behoben werden, indem ein TrimStart('>') in die LINQ.
Nach der Behebung dieses Problems liefern die beiden Tools jedoch immer noch unterschiedliche Ergebnisse. Der culprint ist die LINQ standardmäßig mit CurrentCulture um Zeichenfolge zu sortieren, und ich völlig ignorieren die revelant Sortieroption in resXResourceManager, für dieses Problem, ich denke, die beste Sortieroption ist "Ordinal". Nach dem Hinzufügen der Sortieroption zur Code-Projektlösung und dem Einstellen der gleichen Sortieroption in ResXResourceManager, schließlich produzieren sie genau das gleiche Ergebnis!
Obwohl resxResourceManager großartig ist, um die Ressource zentral zu verwalten und das Problem mit der Reihenfolge der resx-Elemente zu beheben, ist das Code-Projekt-Tool für mich immer noch von unschätzbarem Wert, da es eigenständig ist und somit in einer Vielzahl von Fällen verwendet werden kann; außerdem ist der Code sehr knapp und elegant.
Ich würde eine weitere Anmerkung am Ende meines Updates hinzufügen, ich benutze tortoise git, ich benutze Araxis, um verschiedene Versionen zu vergleichen, es ist fast unsinnig, zwei resx-Dateirevisionen zu vergleichen, jedoch unterstützt Araxis die Anpassung eines Filters, um die Eingabedatei zu transformieren, bevor die Vergleichsmaschine sie sieht. Für den Vergleich ruft Araxis den Filter mit dem folgenden Befehl auf: sortresx.exe -f C:\Users\ADMINI ~1 \AppData\Local\Temp\mrg.8032.3.resx C:\Users\ADMINI ~1 \AppData\Local\Temp\mrg.8032.2 C:\Users\ADMINI ~1 \AppData\Local\Temp\mrg.8032.4
-f bedeutet foward, der erste Dateiname ist die Eingabedatei, der zweite Dateiname ist die Ausgabedatei, die der Filter schreiben soll, die dritte Datei kann getrost ignoriert werden. Nachdem ich eine kleine Änderung am Code-Projekt-Code vorgenommen habe, kann ich jetzt ein Filterprogramm kompilieren, es in Araxis konfigurieren und einen vernünftigen resx-Revisionsvergleich durchführen, selbst bei alten, verpfuschten resx-Dateien.