XMLBeans

 

Was ist XMLBeans?

 

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!

 

Was machen wir damit?

 

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.

 

Vorbereitungen

 

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:

 

  1. Entpacken Sie zuerst das XMLBeans Paket (z.B. unter c:\xmlbeans-1.0.3)
  2. Öffnen Sie eine Konsole (Commandline)
  3. setzen Sie XMLBEANS_HOME (set XMLBEANS_HOME=c:\xmlbeans-1.0.3)
  4. setzen Sie die PATH Variable auf das bin Verzeichnis (set PATH=%PATH%;%XMLBEANS_HOME%\bin
  5. Testen Sie alles, indem Sie in der Konsole den Befehl scomp ausführen. Scomp ist der Schema Compiler von XMLBeans.

 

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.

 

Unser Adressbuch Beispiel

 

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();

        }

    }

 

}

 

XML Cursor

 

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.

 

Fazit

 

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