Einfach
gesagt ist XMLBeans ein Java/XML Bindungswerkzeug.
Entwickelt wurde es von den Jungs von Apache (http://xmlbeans.apache.org/). „Schon
wieder?“, werden Sie sich möglicherweise fragen. Aber geben Sie XMLBeans eine Chance, denn es macht einige Dinge wirklich
gut. Das Prinzip ist schnell erklärt: Man nimmt ein XML Schema, lässt sich die
Java Klassen generieren und kann sofort loslegen. Sie glauben mir nicht, dass
es so einfach funktioniert? Lassen Sie sich überraschen!
Wir werden
in diesem Artikel ein Beispiel von A-Z durchspielen, damit Sie eine gute Basis
für eigene Experimente mit XMLBeans entwickeln können.
Als Beispiel dient wieder einmal das gute alte Adressbuch. Doch bevor wir
loslegen, müssen noch ein paar Vorbereitungen getroffen werden.
Persönlich
bin ich kein grosser Freund dessen, was die meisten Apache
Projekte als Installation anbieten. Es braucht immer gewisse Vorbereitungsschritte.
Doch anscheinend stören sich nicht viele daran ;-).
Hier eine
Liste der benötigten Software, um erfolgreich mit XMLBeans
arbeiten zu können:
JDK
1.4
XMLBeans (http://xmlbeans.apache.org/index.html)
Leider müssen Sie die Arbeitsumgebung noch etwas anpassen.
Wenn man weiss wie, ist die Installation ein Kinderspiel:
Achten Sie darauf, dass sowohl java.exe als auch javac.exe ebenfalls im Pfad verfügbar sind. Testen Sie dies indem Sie java und javac in der Konsole ausführen.
In diesem
Beispiel wollen wir ein Set aus Java Klassen generieren, welches wir dazu
benützen können, um XML Dokumente einzulesen sowie abzuspeichern. Das
Datenmodell soll ein einfaches Adressbuch beschreiben.
So soll
unsere XML Struktur aussehen (adressbuch.xml):
<?xml version="1.0" encoding="UTF-8"?>
<AdressBuch>
<AdressEintrag>
<name>Meier</name>
<vorname>Josef</vorname>
<alter>12</alter>
</AdressEintrag>
<AdressEintrag>
<name>Muster</name>
<vorname>Max</vorname>
<alter>99</alter>
</AdressEintrag>
</AdressBuch>
Und hier
das dazu passende Schema (adressbuch.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="AdressBuch">
<xs:complexType>
<xs:sequence>
<xs:element ref="AdressEintrag" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AdressEintrag">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="vorname"/>
<xs:element ref="alter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="alter" type="xs:integer"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="vorname" type="xs:string"/>
</xs:schema>
Das
Datenmodell ist einfach: Ein Adressbuch besteht aus Adresseinträgen, welches
wiederum aus Name, Vorname und Alter besteht.
Diese
Informationen genügen XMLBeans, um ein ganzes Set
an Java Klassen für uns zu erstellen.
Speichern
Sie das XML Dokument und das Schema in einem geeigneten Verzeichnis ab (z.B.
c:\xmlbeans_samples).
Wechseln
Sie mit der Konsole in dieses Verzeichnis und rufen Sie den folgenden Befehl
auf:
scomp -out adressbuch.jar
adressbuch.xsd
In dem
Verzeichnis sollten Sie nun das generierte JAR adressbuch.jar vorfinden.
Nun müssen
wir die Klassen ganz einfach in unserem Projekt einsetzen. Dazu müssen sich die
JAR Dateien adressbuch.jar und xbean.jar
im Klassenpfad befinden.
package ch.menzsoft.xmlbeans;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import noNamespace.AdressBuchDocument;
import noNamespace.AdressEintragDocument;
public class Sample1 {
public static void main(String[] args) {
AdressBuchDocument
document = AdressBuchDocument.Factory.newInstance();
AdressBuchDocument.AdressBuch
adressBuch = document.addNewAdressBuch();
AdressEintragDocument.AdressEintrag eintrag = adressBuch.addNewAdressEintrag();
eintrag.setName("Müller");
eintrag.setVorname("Franz");
eintrag.setAlter(new BigInteger("9"));
try {
document.save(new File("test.xml"));
} catch (IOException
e) {
e.printStackTrace();
}
}
}
Auf den ersten Blick sieht das ganze sicherlich etwas ungewöhnlich aus, aber man gewöhnt sich recht schnell daran. Wie Sie sehen, arbeiten Sie lediglich mit richtigen Java Klassen und müssen sich nicht um die XML Details kümmern. Das Einlesen und bearbeiten von XML Dokumenten ist ebenfalls sehr einfach!
package ch.menzsoft.xmlbeans;
import java.io.File;
import java.io.IOException;
import org.apache.xmlbeans.XmlException;
import noNamespace.AdressBuchDocument;
import noNamespace.AdressEintragDocument;
public class Sample2 {
public static void main(String[] args) {
try {
AdressBuchDocument
doc = AdressBuchDocument.Factory.parse(new File("test.xml"));
AdressEintragDocument.AdressEintrag eintrag = doc.getAdressBuch().getAdressEintragArray(0);
System.out.println(eintrag.getName());
System.out.println(eintrag.getVorname());
System.out.println(eintrag.getAlter());
} catch (XmlException e) {
e.printStackTrace();
} catch (IOException
e) {
e.printStackTrace();
}
}
}
Im Prinzip
erstellt der Schema Compiler für jedes Element einen Document
Typ mit entsprechender Factory. Ihnen ist bestimmt
aufgefallen, dass alle Klassen in einem etwas seltsamen Package
liegen, nämlich noNamespace.
Das ist nicht besonders elegant. Dies ist jedoch nicht wirklich ein Problem,
denn eine Lösung steht bereits bereit: Konfigurationsdateien. Diese
Konfigurationsdateien sind für den Schema Compiler gedacht und schreiben ihm
zum Beispiel vor, in welchem Paket die generierten Klassen liegen sollen.
<?xml version="1.0"
encoding="UTF-8"?>
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
<xb:namespace>
<xb:package>ch.menzsoft.xmlbeans</xb:package>
</xb:namespace>
<xb:namespace>
<xb:prefix>Xml</xb:prefix>
<xb:suffix>Bean</xb:suffix>
</xb:namespace>
</xb:config>
Hiermit sagen
wir dem Compiler, dass unsere Klassen im Paket ch.menzsoft.xmlbeans
liegen sollen und dass alle unsere Klassen mit dem Präfix Xml
beginnen und dem Suffix Bean enden sollen. Dies wirkt
sich natürlich auf unsere Beispiele aus, hier das erste noch einmal mit unserem
neuen adressbuch.jar:
package ch.menzsoft.xmlbeans;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
public class Sample1 {
public static void main(String[] args) {
XmlAdressBuchDocumentBean
document = XmlAdressBuchDocumentBean.Factory.newInstance();
XmlAdressBuchDocumentBean.AdressBuch adressBuch = document.addNewAdressBuch();
XmlAdressEintragDocumentBean.AdressEintrag
eintrag = adressBuch.addNewAdressEintrag();
eintrag.setName("Meier");
eintrag.setVorname("Hans");
eintrag.setAlter(new BigInteger("12"));
try {
document.save(new File("test.xml"));
} catch (IOException
e) {
e.printStackTrace();
}
}
}
Es kann notwendig sein, mehr Kontrolle über die generierte XML Struktur zu erhalten. Im obigen Beispiel haben wir einen Adresseintrag hinzugefügt, an welcher Stelle im XML Dokument sich dieser letztendlich befindet, war uns egal. Es kann aber von grosser Bedeutung sein, dass alle Einträge zum Beispiel sortiert in die XML Datei geschrieben werden. Dazu bietet uns XMLBeans auch eine Lösung durch XML Cursors an. Auf dieses Verfahren möchte ich jedoch in diesem Artikel nicht weiter eingehen. Mehr Informationen hierüber finden Sie wie üblich unter http://xmlbeans.apache.org/index.html.
Kann es einfacher sein, mit XML Strukturen zu arbeiten? Nach kurzer Eingewöhnungszeit werden Sie die Vorzüge von XMLBeans bald zu schätzen wissen. Stellen Sie sich vor, wie einfach sie Integrationsprobleme lösen könnten? Einfach ein Set von Java Klassen bereitstellen und jeder, der an Ihren XML Daten interessiert ist, kann diese ohne grossen Aufwand einlesen und bearbeiten. Diese Einführung hat nur die grundlegenden Aspekte von XMLBeans angeschnitten, es gibt also noch jede Menge zu entdecken. Viel Spass dabei!
© Christian Menz