Moderne XML-Verarbeitung
Artikel erschienen in Swiss IT Magazine 2007/08
XML als Datenformat ist heute überall zu finden: In Office-Anwendungen, Konfigurationsdateien, als Datenaustauschformat in Geschäftsanwendungen und in Webservices. In einem der letzten Java-Artikel wurden die Webservice Frameworks XFire und Apache Axis 2 (InfoWeek 02/2007) vorgestellt. Der Datenaustausch erfolgt auch bei diesen im XML-Format mit der Anforderung, dass eine einfache Abbildung der XML-Daten auf die Domain-Objekte möglich sein muss.
DOM-Parser wie dom4j oder jdom sind sehr einfach zu verwenden und für viele Anwendungszwecke geeignet, haben aber auch Nachteile. Beispielsweise muss das ganze Dokument im Speicher gehalten werden. Ein konzeptioneller Nachteil ist ausserdem die Tatsache, dass die XML-Daten in eine «generische» Baumstruktur eingelesen werden. Das heisst, dass das XML-Dokument als Baumstruktur gleichartiger Elementobjekte dargestellt wird.
XML-Binding hingegen geht hier einen Schritt weiter. Der Entwickler definiert, wie XML-Daten auf Objekthierarchien abgebildet werden sollen. Der Kasten auf der nächsten Seite stellt die Prinzipien der Parser vereinfacht dar. In diesem Beispiel werden die Vorteile sofort offensichtlich.
Als Entwickler muss man nun nicht mehr mit generischen Elementen arbeiten, sondern kann wie gewohnt mit Domain-Objekten operieren. Aus dem
Name name = person.getName();
Sobald also der Entwickler einmal die Abbildung zwischen XML-Daten und Objekten definiert hat (also das Binding), ist die Arbeit mit dem Parser äusserst einfach: Der Entwickler initialisiert und startet den Parser. Daraufhin bekommt er eine Objekthierarchie mit konkreten Objekten wie im Beispiel zurück.
Auch der umgekehrte Weg ist möglich: Aus einer Objekthierarchie wird «auf Knopfdruck» (wenn das Binding definiert ist) ein XML-Dokument, das einem definierten Schema entspricht.
Die grundlegende Idee des XMLBinding ist also das Mapping von XML-Daten auf (Java-)Objekte. Der prinzipielle Ablauf wird in der Grafik illustriert. Typischerweise geht man von einem W3C-Schema aus, auch wenn manche Bibliotheken die Möglichkeit bieten, mit Java-Annotationen zu arbeiten. Die meisten Bibliotheken bieten dann verschiedene Werkzeuge an, die die Arbeit erleichtern sollen. Eines der Werkzeuge erlaubt es, aus dem XML-Schema Klassen zu erstellen, die die XML-Daten aufnehmen können. Wurden diese erstellt, arbeitet der Entwickler dann nur noch mit der High-Level-API, die aus den XML-Daten die Objekte erstellt beziehungsweise diese wieder zu XML serialisiert.
Das Erstellen der konkreten Objekte hat gegenüber dem DOM-Ansatz verschiedene Vorteile. Einerseits entspricht es dem üblichen Vorgehen, mit konkreten Domain-Objekten zu arbeiten und nicht mit generischen Element-Objekten. Ausserdem bieten die DOM-Elemente auch nur generische Zugriffsmethoden an, um mit den Daten zu arbeiten, also kann man beispielsweise einem Element nur ein anderes Element als Kind zuweisen.
Beim Binding sieht das anders aus. Ist es im Schema definiert, so werden Objekte mit konkreten Zugriffsmethoden erstellt. Um das obige Beispiel wieder aufzugreifen:
Im Java-Umfeld wurde in den letzten Jahren eine Reihe von leistungsfähigen Binding-Bibliotheken entwickelt, von denen die bekanntesten unter Open-Source-Lizenzen stehen. Zu nennen sind unter anderem Apache XMLBeans, auf der in diesem Artikel der Hauptfokus liegt, Castor, JAXB, einige spezialisierte Tools wie ADB und Aegis, die in Webservice-Frameworks verwendet werden können, sowie JiXB.
Ausser Konkurrenz könnte man auch noch XStream nennen. XStream ist kein Binding-Framework, zeigt aber Ansätze in diese Richtung. XStream ist direkt mit der Java-Objekt-Serialisierung vergleichbar und funktioniert im Prinzip auch in derselben Weise, erzeugt aber keine Binär-Streams, sondern XML-Daten. Diese können dann wieder zu Objekten deserialisiert werden. Auch mit XStream hat man gewisse rudimentäre Möglichkeiten, den XML-Output zu steuern. Beispielsweise kann die Benennung der Elemente definiert werden, aber auch, ob Daten als Element oder Attribut gespeichert werden sollen.
XMLBeans bietet volle Schema-Unterstützung an sowie eine Validierungs-API, die an verschiedenen Stellen XML-Daten gegen das Schema validieren kann. Interessant kann es in manchen Anwendungen sein, bei Aufruf von Setter-Methoden (also bei Änderungen von Daten auf Objektebene) zu validieren.
Besonders interessant ist bei XMLBeans jedoch die Tatsache, dass verschiedene Sichten auf die XML-Daten geboten werden. Einerseits gibt es den Schema-orientierten Ansatz, wie er oben schon diskutiert wurde. Daneben existiert aber die Möglichkeit, nicht über konkrete Objekte mit den XML-Daten zu arbeiten. Statt dessen werden Cursors und Tokens verwendet, die konzeptionell in etwa mit dem DOM-Ansatz vergleichbar sind.
XMLBeans bietet damit die Möglichkeit, einerseits grob granular mit Objekten zu arbeiten oder alternativ sehr fein granuliert mit Cursor/Tokens direkt auf XML-Ebene vollen Zugang zum XML-Infoset zu bekommen. Dies schliesst den Zugriff beispielsweise auf XML-Kommentare, Processing Instructions sowie Whitespaces mit ein.
In den letzten Versionen bietet XMLBeans den sogenannte «XMLStore» an. Hier ist ein Wechsel zwischen den Sichten auf ein und dieselben Daten über die verschiedenen Zugriffsobjekte XmlObject, XmlCursor und DomLevel2 jederzeit in einer Anwendung möglich.
Weiter kann man über XMLBeans auch mit Abfragen in XPath sowie dem leistungsfähigen XQuery arbeiten.
In den letzten Jahren hat sich viel im Bereich von XML-Frameworks getan. Es gibt mittlerweile eine grosse Anzahl an verschiedensten XML-Zugriffskonzepten und
-implementierungen. Die «alten» SAX-Parser haben zwar nach wie vor in manchen Anwendungen ihre Berechtigung, vor allem dort, wo hohe Geschwindigkeit bei niedrigem Speicherverbrauch gefragt und wenig komplexe Zugriffsmechanismen erforderlich sind.
DOM-Parser wie dom4j und JDom wiederum sind ebenfalls noch von Interesse, da sie sehr einfach zu erlernen und zu verwenden sind, werden also auch weiterhin für viele Anwendungen gerne eingesetzt. Ausserdem bieten sich DOM-Parser dort an, wo die XML-Datenstruktur nicht präzise definiert ist oder eher «dokumentartig» aussieht.
Daneben findet man Platz für XMLSerialisierungstechniken wie XStream, die ebenfalls sehr einfach anzuwenden sind.
XML-Binding-Technologien zeigen aber das Potential, die dominierende Technologie der nächsten Jahre zu sein, denn sie bieten eine Menge mehr an Möglichkeiten, wie man an Systemen wie XMLBeans oder Castor leicht erkennen kann. Sie erfordern jedoch mit Sicherheit eine längere Einarbeitungszeit sowie im Moment noch einen höheren Initialaufwand, da sie Schemas sowie Binding-Definitionen benötigen. Dies ist besonders dann zu rechtfertigen, wenn die generierten Klassen und Binding-Definitionen in mehreren Applikationen Verwendung finden oder (im Fall von Castor) Objekte sowohl mit relationalen Datenbanken wie auch mit XML interagieren sollen.
Jedem Entwickler im XML-Umfeld ist es dennoch dringend anzuraten, auf die Möglichkeiten, die Systeme wie XMLBeans, Castor und JAXB bieten, einen genaueren Blick zu werfen.
Alexander Schatten (alexander@schatten.info) ist Assistent am Institut für Softwaretechnik und interaktive Systeme der Technischen Universität Wien.