XML parsen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PyKryt
User
Beiträge: 3
Registriert: Mittwoch 28. September 2016, 14:21

Hi,
ich habe momentan das Problem, dass verschiedene XML-Parser die gleiche XML parsen und dabei ein Changeset rauskommt, der mit dem eigentlichen Inhalt nichts zu tun hat.
Konkret: Ich benutze von Qt die Tools lupdate und Linguist, um Übersetzungen in verschiedenen Sprachen vorzunehmen. Die Übersetzungen werden in XML-Dateien gespeichert.
Nun haben wir für gewisse Zwecke ein Python-Programm geschrieben, der diese XML-Dateien modifiziert. Nur wird der Stil von der ursprünglichen XML-Datei nicht beibehalten und wir erhalten nach der Verarbeitung ein riesiges Changeset. Der Qt-XML-Parser ist leider recht inkonsequent, so gibt es leere Tags wie:

Code: Alles auswählen

<translation></translation>
Und andere Tags werden so abgeschlossen:

Code: Alles auswählen

<Version number="2.0" />
Wenn ich die Dateien mit python 3 mit der Standard-Konfiguration parse, dann wird z. B.

Code: Alles auswählen

<translation></translation>
in

Code: Alles auswählen

<translation />
umgewandelt.

Wenn ich dem Parser sage, er soll die lange Variante nehmen, dann wird

Code: Alles auswählen

<Version number="2.0" />
zu

Code: Alles auswählen

<Version number="2.0"></Version>
Nichts funktioniert. Ich bin kurz davor alles selber mit Regular Expression zu parsen. Gibt es noch andere Alternativen? Habe ich eine Option übersehen?

BTW: Wie konnte man an ein solches Szenario nie denken?! Es gibt noch andere Szenarien wie z. B. Checksums für XML-Datei wo ein Server die XML-Datei neu generiert und sich die Checksum ändert.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@PyKryt: wo ist denn das Problem bei den verschiedenen Repräsentationen der selben XML-Daten? Warum machst Du nicht einfach immer den "Normalisierungsschritt" mit Python?
BlackJack

@PyKryt: Das was Du da vorhast ist nicht so einfach. Das serialisierte Dokument wird von den üblichen Bibliotheken geparst und liegt dann als DOM im Speicher vor, das nichts mehr über die Informationen, die Du anscheinend erhalten möchtest, weis. Das ist so schlicht nicht vorgesehen. Eine Prüfsumme über eine XML-Datei kann Dir nur sagen ob diese konkrete Serialisierung des Dokuments sich verändert hat. Zwei gleiche Dokumente können aber durchaus unterschiedliche Prüfsummen besitzen. Eben weil es viele Freiheiten in der Serialisierung gibt. Das W3C hat eine kanonische Form definiert (https://www.w3.org/TR/xml-c14n) die sich beispielsweise mit `lxml` schreiben lässt. Als externes Werkzeug kann man ``xmllint`` verwenden um eine XML-Datei in eine kanonische Form zu überführen.
PyKryt
User
Beiträge: 3
Registriert: Mittwoch 28. September 2016, 14:21

Sirius3 hat geschrieben:@PyKryt: wo ist denn das Problem bei den verschiedenen Repräsentationen der selben XML-Daten? Warum machst Du nicht einfach immer den "Normalisierungsschritt" mit Python?
Es geht um den Change-Set in der Versionsverwaltung.
Stell dir vor, du hast zehn inhaltliche Änderungen, aber tausende Metadaten haben sich geändert (das ist jetzt keine Theorie, sondern tatsächlich bei uns der Fall). – Du kannst die inhaltlichen Änderungen nicht mehr nachvollziehen.

@BlackJack:
Eine Normalisierung kann nicht immer automatisiert ausgeführt werden. Wenn zum Beispiel ein Key mit dem Linguist übersetzt wird, müsste der Entwickler manuell ein Skript aufrufen, um die XML-Datei zu normalisieren. Diesen Workflow will ich niemanden aufzwingen.

Danke, jedenfalls, für die Antworten. Ich werde wohl einfach Regex benutzen. Das wird kein Hexenwerk sein, auch wenn ich gehofft habe, dass es eine Option im XML-Modul von python gibt.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@PyKryt: NEIN. XML sind keine Text-Dateien, sie sehen nur zufällig so ähnlich aus. Für Vergleiche, was sich geändert hat, muß man dann auch die passenden Tools verwenden. Das Argument, dass man was einem Entwickler nicht zumuten kann, sollte kein Grund sein, etwas zusammenzumurksen. Dein Versionsverwaltungstool hat doch hoffentlich Hooks, die einem die Normalisierung abnehmen.
BlackJack

@PyKryt: Serialisiertes XML mit regulären Ausdrücken zu bearbeiten ist doch genau wegen dem Problem was Du hast eine ganz schlechte Idee. Es ist halt nicht robust, weil die gleichen Daten sehr unterschiedlich serialisiert werden können. Ich würde da eher versuchen die Normalisierung irgendwie zu automatisieren. Zum Beispiel über Hooks bei der Versionsverwaltung.
PyKryt
User
Beiträge: 3
Registriert: Mittwoch 28. September 2016, 14:21

Hooks wäre tatsächlich interessant oder ich lasse lupdate nochmals nach meinem Skript automatisiert drüberjagen.

Danke, für die Tipps!
Antworten