home  |  suche  |  kontakt/johner  |  institut  |  hinweise 
studierende  |  tech-docs  |  blog  |  mindmailer 

JAXB: Java Architecture for XML Binding

Mit JAXB können Sie auf einfache Weise

  • Instanzen von Java-Klassen als XML serialisieren (marshalling)
  • Aus XML Java-Klassen instanzieren (unmarshalling)
  • Aus XML-Schema (XSD) Java-Klassen generieren (Schema compiler)
  • Aus Java-Klassen XML-Schema (XSD) erzeugen (Schema generator)

Damit eignet sich JAXB ideal, um

  • Daten zwischen verteilten Anwendungen auszutauschen. Wohlgemerkt: Dies funktioniert auch zwischen Anwendungen, die in unterschiedlichen Programmiersprachen entwickelt sind. Beispielsweise könnte ein .NET-Entwickler dem Java-Entwickler die XSD-Datei schicken, diese würde daraus Java-Klassen generieren. Dann könnten beide Dateien mit Hilfe (Un-)Marshalling kommunizieren.
  • Anwendungsdaten zu persistieren (als Alternative zu einer Datenbank)
  • bestehende XML-Dateien einfach als Java-Objekte zu verarbeiten.

Installation

Die Installation beschränkt sich darauf, die jar-Dateien von https://jaxb.dev.java.net/ herunterzuladen, im Eclipse-Projekt im lib-Verzeichnis zu speichern und dem "Buildpath" hinzuzufügen.

Bitte klicken Sie dazu auf der genannten Webseite auf "Download", wählen Sie Releases aus und dort das aktuellste (aber keines, das als "EA" gekennzeichnet ist).

Achtung: Die heruntergeladene jar-Datei ist ein Executable, das Sie zuerst durch Doppelklick ausführen müssen! Daraufhin entpackt sich diese Datei. Die jar-Dateien im erzeugten lib-Folder, sind diejenigen, die Sie brauchen.

 

Mashalling

In unserem Beispiel wollen wir zwei Klassen, nämlich eine Klasse Fuhrpark und eine Klasse Fahrzeug, die beide in einer 1:n-Beziehung stehen, serialisieren (marshalling).

Dazu bedarf es nur der folgenden vier Zeilen:

JAXBContext jaxbContext = JAXBContext.newInstance("johner.xsd2java.generated");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(fuhrpark, System.out);

"johner.xsd2java.generated" gibt das Package an. Um den JAXBContext zu instanzieren (1. Zeile) muss im genannte Package eine Textdatei jaxb.index liegen, die die Namen der Klassen (ohne Package) als einzelne Zeilen enthält, also in unserem Beispiel wie folgt aussieht:

Fahrzeug
Fuhrpark

Der vollständige Source-Code ist auf der Beispielseite gelistet.

Unmarshalling

Ähnlich einfach und unserem Beispiel folgend lässt sich eine XML-Datei wie diese wieder in Java-Instanzen zurückwandeln: 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fuhrpark>
    <fahrzeuge>
        <fahrzeugtyp>kombi</fahrzeugtyp>
        <ps>12</ps>
        <typ>X3</typ>
    </fahrzeuge>
    <fahrzeuge>
        <fahrzeugtyp>limousine</fahrzeugtyp>
        <ps>120</ps>
        <typ>A18</typ>
    </fahrzeuge>
    <name>Ines Fuhrpark</name>
</fuhrpark>

Dazu bedarf es wieder nur weniger Zeilen:

JAXBContext jaxbContext = 
JAXBContext.newInstance("johner.java2xml.dateien");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Fuhrpark fuhrpark =
(Fuhrpark)unmarshaller.unmarshal(new FileInputStream("input.xml"));

 Zu beachten ist hier

  • johner.java2xml.dateien bezeichnet das Package
  • input.xml muss im Package liegen, andernfalls muss der Pfad zu dieser Datei explizit angegeben werden.
  • Es bedarf auch hier der jaxb.index-Datei (siehe oben)

Der vollständige Source-Code ist auf der Beispielseite gelistet.

Java to XSD (Schema Compiler)

Im Fall des Schema Compilers muss kein eigener Code geschrieben werden, sondern die XJCFacade aufgerufen werden:

com.sun.tools.jxc.SchemaGeneratorFacade src/johner/java2xml/dateien/*.java

Der Kommandozeilenparameter spezifiziert alle Dateien, die zu berücksichtigen sind, hier alle Java-(Source-)Dateien im Verzeichnis src/johner/java2xml/dateien.

Dieser Aufruf kann entweder von Kommandozeile oder mit Hilfe von Eclipse erfolgen: Run -> Run Configurations -> Links "Java Application" auswählen -> "New Button".

 

zum Vergrößern klicken

XSD to Java (Schema Generator)

Schließlich besteht die Möglichkeit, aus XML-Schema (XSD) direkt Java-Klassen zu genererieren, die dem Schema entsprechen. Wie im Fall Java2Schema muss hierzu eine neue "Run Configuration" in Eclipse angelegt werden.

Der Befehl, der über die Kommandozeile auszuführen wäre, lautet:

com.sun.tools.xjc.XJCFacade -d src -p johner.xsd2java.generated schema1.xsd 

Hierbei bezeichnen

  • -d: Zielverzeichnis (hier src)
  • -p: package (im Zielverzeichnis
  • schema1.xsd die Schemadatei, die ohne weitere Pfadangabe direkt im Projektordner liegen sollte.
Zum Vergrößern klicken