Ich habe zwei Dateien mit den gleichen Daten, aber in unterschiedlichen Zeilen.
Datei 1:
<Identities>
<Identity>
<Id>048206031415072010Comcast.USR8JR</Id>
<UID>ccp_test_79</UID>
<DisplayName>JOSH CCP</DisplayName>
<FirstName>JOSH</FirstName>
<LastName>CCP</LastName>
<Role>P</Role>
<LoginStatus>C</LoginStatus>
</Identity>
<Identity>
<Id>089612381523032011Comcast.USR1JR</Id>
<UID>94701_account1</UID>
<DisplayName>account1</DisplayName>
<FirstName>account1</FirstName>
<LastName>94701</LastName>
<Role>S</Role>
<LoginStatus>C</LoginStatus>
</Identity>
</Identities>
Datei 2:
<Identities>
<Identity>
<Id>089612381523032011Comcast.USR1JR</Id>
<UID>94701_account1</UID>
<DisplayName>account1</DisplayName>
<FirstName>account1</FirstName>
<LastName>94701</LastName>
<Role>S</Role>
<LoginStatus>C</LoginStatus>
</Identity>
<Identity>
<Id>048206031415072010Comcast.USR8JR</Id>
<UID>ccp_test_79</UID>
<DisplayName>JOSH CCP</DisplayName>
<FirstName>JOSH</FirstName>
<LastName>CCP</LastName>
<Role>P</Role>
<LoginStatus>C</LoginStatus>
</Identity>
</Identities>
Wenn ich den diff file1 file2
Befehl benutze, erhalte ich folgende Antwort:
1,10d0
< <Identities>
< <Identity>
< <Id>048206031415072010Comcast.USR8JR</Id>
< <UID>ccp_test_79</UID>
< <DisplayName>JOSH CCP</DisplayName>
< <FirstName>JOSH</FirstName>
< <LastName>CCP</LastName>
< <Role>P</Role>
< <LoginStatus>C</LoginStatus>
< </Identity>
20a11,20
> <Identities>
> <Identity>
> <Id>048206031415072010Comcast.USR8JR</Id>
> <UID>ccp_test_79</UID>
> <DisplayName>JOSH CCP</DisplayName>
> <FirstName>JOSH</FirstName>
> <LastName>CCP</LastName>
> <Role>P</Role>
> <LoginStatus>C</LoginStatus>
> </Identity>
Aber ich muss keinen Unterschied machen, weil diese Dateien die gleichen Daten in verschiedenen Zeilen haben.
bash
shell
xml
file-comparison
user32026
quelle
quelle
xmldiff
, aber ich denke, das wird immer noch eine Änderung der Reihenfolge bemerken, da die Reihenfolge in generischem XML relevant ist. Ich denke, Ihr bester Ansatz ist es, einen XML-Parser und -Generator zu verwenden, um jede Datei in eine kanonische Reihenfolge und ein kanonisches Format zu bringen, und dannxmldiff
oder zu verwendendiff
. Ein Job für Ihre bevorzugte Skriptsprache (Perl, Ruby, Python usw.).Antworten:
Sie können mit Hilfe eines kleinen Python-Skripts erreichen, was Sie möchten (Python muss installiert sein, ebenso wie das
lxml
Toolkit).tagsort.py
::Dieses Skript sortiert die Elemente der ersten Ebene unter dem XML-Dokumentstamm nach dem Inhalt eines Elements der zweiten Ebene und sendet das Ergebnis an stdout. Es heißt so:
Sobald Sie das haben, können Sie die Prozessersetzung verwenden , um ein Diff basierend auf seiner Ausgabe zu erhalten (ich habe ein Element hinzugefügt und ein anderes in Ihren Beispieldateien geändert, um ein nicht leeres Ergebnis anzuzeigen):
quelle
Ich hatte ein ähnliches Problem und fand schließlich: /superuser/79920/how-can-i-diff-two-xml-files
In diesem Beitrag wird vorgeschlagen, eine kanonische XML-Sortierung und dann einen Diff durchzuführen. Folgendes sollte für Sie funktionieren, wenn Sie unter Linux oder Mac arbeiten oder wenn Sie Windows wie Cygwin installiert haben:
quelle
Es ist eine getaggte Shell, aber ehrlich gesagt bevorzuge ich die Verwendung einer Skriptsprache mit einem Parser. In diesem Fall
perl
mitXML::Twig
.Es geht ungefähr so:
Ich vergleiche explizit jeweils ein 'Identity'-Element und überprüfe, ob alle Felder in einem in dem anderen mit demselben Wert vorhanden sind.
Und dann kehren Sie das um, weil die zweite Datei möglicherweise zusätzliche Einträge enthält.
quelle