XML-Sortierung

XML-Dateien sortieren? Um Gottes Willen! Warum sollte man das denn bitteschön machen? Das wird sich so mancher fragen, wenn ich ihm von einem aktuellen Problem berichte. Schauen wir uns das doch mal genauer an.

In einem aktuellen Projekt geht es – kurz gesagt – darum, den Export eines Programms zu überprüfen. Dabei überprüfen wir bei jedem Release, ob der Export noch genau dasselbe tut wie im vorherigen Release. Ein Regressionstest also, weitgehend automatisiert. Zu diesem Zweck werden echte Daten aus der Produktion gezogen und durch beide Software-Versionen durchgeschleift, die alte und die neue. Der Export der alten Version wird dann mit dem Export der neuen Version verglichen. Aufgrund der Vielzahl an Testdateien und vor allem deren Aktualität besteht hoffentlich eine hinreichende Abdeckung sämtlicher Situationen.

Werbung

Natürlich darf sich der Export auch mal ändern. Das wird immer dann der Fall sein, wenn an der entsprechenden Funktion etwas geändert werden musste, etwas neues hinzugekommen ist oder ein Teil heraus genommen wurde. Damit in diesem Fall kein unnötiger Alarm ausgegeben wird, setzen wir das Unix-Tool “diff” ein. Dieses kann auf der Kommandozeile mit einer Ausnahmeregel versorgt werden:

diff –I RE file1 file2

“RE” steht dabei als Platzhalter für die Regular Expression und beschreibt hier in dieser ganz speziellen Abfragesyntax, welche Änderungen ignoriert werden sollen. Das ist ein guter und etablierter Mechanismus, und der funktioniert auch recht ordentlich. Zur genauen Schreibweise (ist nicht ganz einfach) siehe Doku des diff-Befehls!

Leider jedoch sind Softwareänderungen manchmal etwas tricky. Nicht immer ist auf den ersten Blick ersichtlich, welche Auswirkungen die Änderungen im Programmablauf auf den Export haben. So ist es öfter passiert, dass Teile des XML-Exports in anderer Reihenfolge heraus kamen als zuvor. Das betraf sowohl Attribute als auch die XML-Tags selbst. Da es sich bei “unserem” XML nur um eine Strukturbeschreibung handelt (Positionen und Eigenschaften von Objekten auf einer graphischen Bildschirmanzeige), ist die Reihenfolge bedeutungslos. Das ist natürlich keineswegs immer so, daher muss man im Hinblick auf den Nutzen des vorgestellten Verfahrens differenzieren!

Wenn aber die Reihenfolge egal ist und sich die Attribute oder XML-Tags ab und zu mal ändern, dann liegt es nahe, diese zunächst zu sortieren, bevor man sie vergleicht. Leider ist ein normales Sortierkommando dafür ungeeignet. Würde man die Zeilen alphabetisch sortieren, würde dabei die XML-Struktur auseinander gerissen. Davon abgesehen wären Attribute, die normalerweise in einer Reihe stehen, auf diese Weise nicht sortierbar. Es muss also anders gehen.

Betrachten wir zunächst ein Beispiel und überlegen uns, wie – das heißt nach welchen Kriterien – wir diese Daten von Hand sortieren würden:

Werbung
<personen>
     <person nachname="Muster" vorname="Moritz">
         <person nachname="Muster" vorname="MeinKind" />
     </person> 
     <person vorname="Max" nachname="Muster" />
</personen>

Zunächst fällt auf, dass die Attribute mal so und mal so geschrieben sind. Ein direkter Vergleich ist also nicht sinnvoll, zunächst müssen diese sortiert werden. Dann ist es einfach, die beiden Personen auf der 1. Ebene müssen vertauscht werden, da “Max” vor “Moritz” kommt. Doch was wäre, wenn wir nicht Menschen, sondern Knöpfe auf einer GUI hätten? Dann stünde vielleicht statt <person> hier einfach nur <frame> (und das mehrfach), und eine Unterscheidung wäre gar nicht möglich. Dann nämlich müssten wir die hierarchisch tiefer liegenden Informationen hinzuziehen, die aber selbst auch wieder ähnlich aussehen könnten und z.B. (auch mehrere) <button>-Elemente hätten. Die Sortierung muss also tiefer unten in der Hierarchie abgeschlossen sein, bevor sie weiter oben sinnvoll durchführbar ist. Wie macht man das so elegant wie möglich? Und vor allem, wie schafft man es, das Programm nicht bei strukturellen Änderungen des XML immer wieder zu überarbeiten?

Mehr zur Umsetzung bei Gelegenheit im nächsten Teil …

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

eins × vier =