Moderne XML-Verarbeitung

Die Möglichkeiten zum Zugriff auf XML-Daten wächst. Der neuste Trend ist XML-Binding. Wir stellen geeignete Java-Werkzeuge dafür vor.

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.





Folglich ist der Entwickler mit dem Problem konfrontiert, effizient mit XML-Daten arbeiten zu müssen. Verschiedene Zugriffsstrategien und Frameworks wurden in den letzten zehn Jahren entwickelt, um verschiedensten Anwendungsszenarien gerecht zu werden. Zu nennen sind im wesentlichen SAX- (Simple API for XML Parsing) und DOM-Parser (Document Object Model), die seit langem bekannt und im Einsatz sind, sowie seit wenigen Jahren StAX und XML-Binding. XML-Binding ist einer der jüngsten und leistungsfähigsten, aber auch komplexesten Ansätze.




SAX ist oft eine Basistechnologie, auf der andere Bibliotheken (wie DOM) aufsetzen. SAX ist ein Push-Parser. Er wird initialisiert und gestartet, liest dann sequentiell das XML-Dokument und sendet Events an entsprechende Methoden. Solche Events können beispielsweise «StartDocument», «StartElement» oder «EndElement» sein. Die Klasse, die diese Ereignisse verarbeitet, ist alleine dafür verantwortlich, die der Reihe nach eingehenden Daten zu verarbeiten. Es gibt keine weitere Hilfestellung. So kann im Dokument nicht navigiert oder Abfragen formuliert werden.




Dieser Ansatz ist äusserst effizient und speicherschonend, da der Parser nicht das gesamte Dokument im Speicher halten muss, aber für viele Einsatzzwecke auch unhandlich. Daher werden oft DOM-Bibliotheken wie dom4j, JDOM oder Apache Xerces eingesetzt. Diese verwenden typischerweise einen SAX-Parser und erzeugen aus dessen Events eine generische Baumstruktur im Speicher. Auf diese Baumstruktur kann der Entwickler dann bequem zugreifen, darin navigieren, sie verändern oder oft auch Abfragen stellen – beispielsweise mit XPath oder XQuery.




Neben den SAX-Parsern beginnt sich eine weitere Technologie, die sogenannten Pull-Parser wie StaX, durchzusetzen – die teilweise wieder als Basis für komplexere Binding-Bibliotheken verwendet werden. Pull-Parser sollen die Vorteile von DOM und SAX vereinen. Es soll ein flexibler Zugriff auf XML-Daten möglich sein, ohne immer das gesamte Dokument im Speicher halten zu müssen. Sie haben sich aber noch nicht auf einer breiteren Basis durchgesetzt.




Abbildung von XML-Daten auf Objekte


Vom Document Object Model zum Object Binding

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 -Element in den XML-Daten könnte beispielsweise ein Objekt «Person» werden. Das Kind-Element könnte zum Objekt «Name» werden. Der Zugriff auf das Objekt «Name» würde über Objekt-Methoden erfolgen:




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.


XML/Objekt-Binding, ein zweiter Blick

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:




person.setName (name)



Die Methode setName erlaubt als Übergabeparameter nur ein Objekt vom Typ Name. Das «Vorname»-Objekt erlaubt als Wertzuweisung beispielsweise nur einen String. Das heisst, die Erstellung der Objekte und damit in weiterer Folge der XML-Daten ist typen­sicher und kann je nach Framework sogar bei Zugriffen gegen das Schema validiert werden.
Die Eleganz im Arbeiten mit den Objekten und die Typsicherheit erkauft man sich mit einem zusätzlichen initialen Aufwand. Man muss Schemas für die XML-Daten bereitstellen sowie das Binding zu den Objekten entsprechend definieren.
Der DOM-Ansatz ist zwar weniger elegant, dafür kann er mit beliebigen XML-Daten arbeiten, ohne konkrete Schemas kennen zu müssen. Hier muss man je nach Anwendungsfall entscheiden, ob der höhere Initialaufwand sich rechtfertigt oder nicht. Dies kann je nach Anwendungsbereich Vor- und Nachteile haben.
Neuere Framworks wie XMLBeans können mittlerweile mit verschiedenen Sichten auf die XML-Daten punkten.


Binding-Bibliotheken

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.



Volle Kontrolle über die Abbildung zwischen XML und Objekten bieten jedoch die anderen Bibliotheken. Typischerweise ist es notwendig, die XML-Daten mit Hilfe eines W3C-Schemas zu definieren. Durch eine zusätzliche Metainformation kann dann bestimmt werden, welche Elemente in welche Objekte übersetzt werden. Im Prinzip ist dies eine ähnliche Vorgehensweise wie beim Mapping zwischen Objekten und relationalen Datenbanken.


Insofern ist auch Castor hervorzuheben. Mit Castor aus dem Codehaus-Projekt-Pool können sowohl Bindings von Objekten zu XML-Daten als auch zu relationalen Datenbanken definiert werden – eine einzigartige Möglichkeit.
JAXB ist der Binding-Standard von Sun Microsystems und wird in Java 6 Teil der API sein. JAXB bedient sich (alternativ) auch der Technologie der Annotationen, um die Abbildung von Objekten auf XML zu beschreiben.
Eine der leistungsfähigsten Bibliotheken ist aber XMLBeans aus dem Apache-Projekt-Pool. XMLBeans wurde zunächst von Bea Systems entwickelt und war Teil der Middleware Solutions, wurde dann aber vor einigen Jahren an den Apache-Pool als Open Source übergeben.


XML in Bohnen

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 Objekt­ebene) 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 «XML­Store» 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.


Es hat sich viel getan

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.


Der Autor

Alexander Schatten (alexander@schatten.info) ist Assistent am Institut für Softwaretechnik und interaktive Systeme der Technischen Universität Wien.




Artikel kommentieren
Kommentare werden vor der Freischaltung durch die Redaktion geprüft.

Anti-Spam-Frage: Wieviele Zwerge traf Schneewittchen im Wald?
GOLD SPONSOREN
SPONSOREN & PARTNER