[geloest] XMLs vergleichen (diff) mit beliebiger Reihenfolge

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

[geloest] XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von Meillo » 24.05.2022 10:34:07

Hoi,

ich will XMLs vergleichen, dazu eignet sich diff(1) nicht so sehr. Ich suche eine bessere Moeglichkeit. Es muss der Whitespace normalisiert und z.B. Attribute sortiert werden. Dazu habe ich Moeglichkeiten gefunden (`xmllint --c14n' und verschiedenes sonst). Eines habe ich aber bislang nirgends gefunden: Das Sortieren einer Liste gleichnamiger Elemente.

Konkret folgende zwei Dateien:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<root>
        <a>
                <b>foo</b>
        </a>
        <a>
                <b>bar</b>
        </a>
</root>

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<root>
        <a>
                <b>bar</b>
        </a>
        <a>
                <b>foo</b>
        </a>
</root>
Die sollen als gleich gewertet werden, weil mich die Reihenfolge der Liste von a-Elementen nicht interessiert. Die Programme, die ich gefunden habe, koennen aber nur nach Elementnamen sortieren, nicht aber nach dem Baum unter dem Element.

Das Python-Script `xmldiffs' sieht schon ganz gut aus. Hier ist die Sortierzeile:
https://github.com/joh/xmldiffs/blob/06 ... ldiffs#L43
Einen aehnlichen Fall findet man hier:
https://stackoverflow.com/a/25339725
Ich kenne mich mit Python nur nicht aus.

Mein Ziel ist, dass an der Stelle nicht nach dem Elementnamen, sondern nach dem kompletten Baum unter dem Element sortiert wird. Also wenn man es genau nimmt, nach der Stringdarstellung des rekursiv sortierten, normierten XML-Baums darunter.

So wie ich Python kenne ist ist das eine Kleinigkeit. ;-)

Ich denke, dass ich von der Loesung gar nicht so weit entfernt bin. Vielleicht kann mit ein Python-Programmierer einen kleinen Tipp geben.


Alternativ waere auch eine Loesung in Ruby oder Go in Ordnung, oder ein fertiges Programm, das das kann.

Wenn alles nichts hilft koennte ich es auch selber schreiben und mir die Dinge anlesen, aber wenn ich das nicht muesste waer's mir auch recht. :-D
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3556
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von heisenberg » 24.05.2022 14:11:18

Jede Rohheit hat ihren Ursprung in einer Schwäche.

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von thoerb » 24.05.2022 19:28:30

Meillo hat geschrieben: ↑ zum Beitrag ↑
24.05.2022 10:34:07
Wenn alles nichts hilft koennte ich es auch selber schreiben und mir die Dinge anlesen, aber wenn ich das nicht muesste waer's mir auch recht. :-D
Der PHP-Entwickler Vitalij Mik hat gerade vor ein paar Tagen ein Video über PHP Xpath veröffentlicht. Ich selbst habe bisher nur mal kurz rein geguckt, sieht aber auf den ersten Blick ganz interessant aus.

https://www.youtube.com/watch?v=rX4_ZHrq6Ps

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von Meillo » 24.05.2022 21:58:23

heisenberg hat geschrieben: ↑ zum Beitrag ↑
24.05.2022 14:11:18
Debianxmldiff ?
Das war vom Namen her natuerlich meine erste Idee, aber hast du dir mal die Ausgabe davon angeschaut? Zudem kann es mein Problem auch nicht loesen. Fuer die zwei Beispieldateien gibt es einen Unterschied aus.

thoerb hat geschrieben: ↑ zum Beitrag ↑
24.05.2022 19:28:30
Der PHP-Entwickler Vitalij Mik hat gerade vor ein paar Tagen ein Video über PHP Xpath veröffentlicht. Ich selbst habe bisher nur mal kurz rein geguckt, sieht aber auf den ersten Blick ganz interessant aus.
Das Problem ist weniger, dass ich es nicht selber machen koennte, sondern, dass ich es nicht selber machen will. ;-) Ich denke mir, dass mein Problem nicht so selten sein kann. Und es gibt ja auch schon Scripte, die recht aehnlich sind. In dem verlinkten xmldiffs wird man vermutlich nur ein oder zwei Zeilen aendern muessen ... wenn man Python-XML-Profi ist ... was ich leider nicht bin.

Nunja, falls in den naechsten Tagen niemand mit einer Loesung ankommt, dann setze ich mich halt doch selber an die Sache ran. Die Frage ist dann eher, ob ich dann nur die generische Loesung aufbohre oder ob ich lieber etwas spezifischer auf die konkreten mir vorliegenden Dateien eingehe und ein Programm mit Wissen ueber das spezielle XML-Format schreibe. Naja, mal sehen.
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3556
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von heisenberg » 24.05.2022 22:22:27

Meillo hat geschrieben: ↑ zum Beitrag ↑
24.05.2022 21:58:23
heisenberg hat geschrieben: ↑ zum Beitrag ↑
24.05.2022 14:11:18
Debianxmldiff ?
Das war vom Namen her natuerlich meine erste Idee, aber hast du dir mal die Ausgabe davon angeschaut?
Hab's mit Deinem Beispiel kurz angetestet. War nicht hilfreich. Ich dachte mir, dass Du/man da vielleicht vom Aufruf bzw. bei den Parametern noch was drehen kann; aber das ist dann wohl nicht so?
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
shoening
Beiträge: 898
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von shoening » 25.05.2022 08:59:36

Hallo,

wenn die Struktur so einfach ist, dann hilft Dir vielleicht folgender Link weiter:

https://stackoverflow.com/questions/172 ... ing-python

In dem Beitrag werden die Links, die eine Suche zurück liefert nach dem enthaltenen Text sortiert. Das sollte aber auch gehen, wenn Du direkt auf den „children“ Deines „root“ sortierst.

Viele Grüße
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: XMLs vergleichen (diff) mit beliebiger Reihenfolge

Beitrag von Meillo » 25.05.2022 09:24:24

Danke fuer den Tipp, schoening. Manchmal muss der gar nicht direkt die Loesung bieten, sondern nur zu einer weiteren Idee fuehren oder einem zeigen worauf man schauen sollte. So habe ich dann das Python-Script xmldiffs so anpassen koennen, dass es nun sortiert vergleicht. Und zwar habe ich einfach die Funktion `node_key()', die zum Sortieren benutzt wird, um den Teil ab dem Plus erweitert:

Code: Alles auswählen

def node_key(n):
    return node_str(n) + ET.tostring(n, method="text")
Das fuegt die Stringrepraesentation des Teilbaums mit an, wodurch sie beim Sortieren einbezogen wird.

`method="xml"' und `method="text"' haben bei mir bislang immer gleiche Ergebnisse erzeugt. Die muesste man ggf. austauschen. Ich habe nicht genauer recherchiert worin der Unterschied liegt.


Juhu, damit waere das erstmal geloest. Danke fuer die Hilfe. :THX:
Use ed once in a while!

Antworten