Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Äußere.innere Klassen
8 Besondere Klassen der Java SE
9 Generics<T>
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Einführung in die nebenläufige Programmierung
13 Einführung in Datenstrukturen und Algorithmen
14 Einführung in grafische Oberflächen
15 Einführung in Dateien und Datenströme
16 Einführung in die <XML>-Verarbeitung mit Java
17 Einführung ins Datenbankmanagement mit JDBC
18 Bits und Bytes und Mathematisches
19 Die Werkzeuge des JDK
A Die Klassenbibliothek
Stichwort

Download:
- Aufgaben, ca. 1,1 MB
- Programme, ca. 12,8 MB

Buch bestellen
Ihre Meinung?

Spacer
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Galileo Computing
1308 S., 10., aktualisierte Auflage, geb., mit DVD
ca. 49,90 Euro, ISBN 978-3-8362-1802-3
Pfeil 16 Einführung in die <XML>-Verarbeitung mit Java
Pfeil 16.1 Auszeichnungssprachen
Pfeil 16.1.1 Die Standard Generalized Markup Language (SGML)
Pfeil 16.1.2 Extensible Markup Language (XML)
Pfeil 16.2 Eigenschaften von XML-Dokumenten
Pfeil 16.2.1 Elemente und Attribute
Pfeil 16.2.2 Beschreibungssprache für den Aufbau von XML-Dokumenten
Pfeil 16.2.3 Schema – eine Alternative zu DTD
Pfeil 16.2.4 Namensraum (Namespace)
Pfeil 16.2.5 XML-Applikationen *
Pfeil 16.3 Die Java-APIs für XML
Pfeil 16.3.1 Das Document Object Model (DOM)
Pfeil 16.3.2 Simple API for XML Parsing (SAX)
Pfeil 16.3.3 Pull-API StAX
Pfeil 16.3.4 Java Document Object Model (JDOM)
Pfeil 16.3.5 JAXP als Java-Schnittstelle zu XML
Pfeil 16.3.6 DOM-Bäume einlesen mit JAXP *
Pfeil 16.4 Java Architecture for XML Binding (JAXB)
Pfeil 16.4.1 Bean für JAXB aufbauen
Pfeil 16.4.2 JAXBContext und die Marshaller
Pfeil 16.4.3 Ganze Objektgraphen schreiben und lesen
Pfeil 16.5 XML-Dateien mit JDOM verarbeiten
Pfeil 16.5.1 JDOM beziehen
Pfeil 16.5.2 Paketübersicht *
Pfeil 16.5.3 Die Document-Klasse
Pfeil 16.5.4 Eingaben aus der Datei lesen
Pfeil 16.5.5 Das Dokument im XML-Format ausgeben
Pfeil 16.5.6 Elemente
Pfeil 16.5.7 Zugriff auf Elementinhalte
Pfeil 16.5.8 Attributinhalte lesen und ändern
Pfeil 16.6 Zum Weiterlesen

Rheinwerk Computing - Zum Seitenanfang

16.4 Java Architecture for XML Binding (JAXB)Zur nächsten Überschrift

Java Architecture for XML Binding (JAXB) ist eine API zum Übertragen von Objektzuständen auf XML-Dokumente und umgekehrt. Anders als eine manuelle Abbildung von Java-Objekten auf XML-Dokumente oder das Parsen von XML-Strukturen und Übertragen der XML-Elemente auf Geschäftsobjekte arbeitet JAXB automatisch. Die Übertragungsregeln definieren Annotationen, die Entwickler selbst an die JavaBeans setzen können, aber JavaBeans werden gleich zusammen mit den Annotationen von einem Werkzeug aus einer XML-Schema-Datei generiert.

Java 6 integriert JAXB 2.0, und das JDK 6 Update 4 – sehr ungewöhnlich für ein Update – aktualisiert auf JAXB 2.1. Java 7 aktualisiert auf JAXB 2.2.


Rheinwerk Computing - Zum Seitenanfang

16.4.1 Bean für JAXB aufbauenZur nächsten ÜberschriftZur vorigen Überschrift

Wir wollen einen Player deklarieren, und JAXB soll ihn anschließend in ein XML-Dokument übertragen:

Listing 16.6: com/tutego/insel/xml/jaxb/Player.java, Player

@XmlRootElement
class Player
{
private String name;
private Date birthday;

public String getName()
{
return name;
}

public void setName( String name )
{
this.name = name;
}

public void setBirthday( Date birthday )
{
this.birthday = birthday;
}

public Date getBirthday()
{
return birthday;
}
}

Die Klassen-Annotation @XmlRootElement ist an der JavaBean nötig, wenn die Klasse das Wurzelelement eines XML-Baums bildet. Die Annotation stammt aus dem Paket javax.xml.bind.annotation.


Rheinwerk Computing - Zum Seitenanfang

16.4.2 JAXBContext und die MarshallerZur nächsten ÜberschriftZur vorigen Überschrift

Ein kleines Testprogramm baut eine Person auf und bildet sie dann in XML ab – die Ausgabe der Abbildung kommt auf den Bildschirm:

Listing 16.7: com/tutego/insel/xml/xml/jaxb/PlayerMarshaller.java, main()

Player johnPeel = new Player();
johnPeel.setName( "John Peel" );
johnPeel.setBirthday( new GregorianCalendar(1939,Calendar.AUGUST,30).getTime() );

JAXBContext context = JAXBContext.newInstance( Player.class );
Marshaller m = context.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
m.marshal( johnPeel, System.out );

Nach dem Lauf erscheint auf dem Schirm:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<player>
<birthday>1939-08-30T00:00:00+01:00</birthday>
<name>John Peel</name>
</player>

Alles bei JAXB beginnt mit der zentralen Klasse JAXBContext. Die statische Methode JAXBContext.newInstance() erwartet standardmäßig eine Aufzählung der Klassen, die JAXB behandeln soll. Der JAXBContext erzeugt den Marshaller zum Schreiben und den Unmarshaller zum Lesen. Die Fabrikmethode createMarshaller() liefert einen Schreiberling, der mit marshal() das Wurzelobjekt in einen Datenstrom schreibt. Das zweite Argument von marshal() ist unter anderem ein OutputStream (wie System.out in unserem Beispiel), Writer oder File-Objekt.

JAXB beachtet standardmäßig alle Bean-Properties, also birthday und name, und nennt die XML-Elemente nach den Properties.

class javax.xml.bind.JAXBContext
  • static JAXBContext newInstance(Class... classesToBeBound) throws JAXBException
    Liefert ein Exemplar vom JAXBContext mit Klassen, die als Wurzelklassen für JAXB verwendet werden können.
  • abstract Marshaller createMarshaller()
    Erzeugt einen Marshaller, der Java-Objekte in XML-Dokumente konvertieren kann.

abstract Unmarshaller createUnmarshaller()
Erzeugt einen Unmarshaller, der XML-Dokumente in Java-Objekte konvertiert.

class javax.xml.bind.Marshaller
  • void marshal(Object jaxbElement, File output)
  • void marshal(Object jaxbElement, OutputStream os)
  • void marshal(Object jaxbElement, Writer writer)
    Schreibt den Objektgraph von jaxbElement in eine Datei oder einen Ausgabestrom.
  • void marshal(Object jaxbElement, Node node)
    Erzeugt vom Objekt einen DOM-Knoten. Der kann dann in ein XML-Dokument gesetzt werden.
  • void marshal(Object jaxbElement, XMLEventWriter writer)
  • void marshal(Object jaxbElement, XMLStreamWriter writer)
    Erzeugt für ein jaxbElement einen Informationsstrom für den XMLEventWriter beziehungsweise XMLStreamWriter. Die StAX-Klassen werden später genauer vorgestellt.
  • void setProperty(String name, Object value)
    Setzt eine Eigenschaft der Marshaller-Implementierung. Eine Einrückung etwa setzt das Paar Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE.

Rheinwerk Computing - Zum Seitenanfang

16.4.3 Ganze Objektgraphen schreiben und lesenZur vorigen Überschrift

JAXB bildet nicht nur das zu schreibende Objekt ab, sondern auch rekursiv alle referenzierten Unterobjekte. Wir wollen den Spieler dazu in einen Raum setzen und den Raum in XML abbilden. Dazu muss der Raum die Annotation @XmlRootElement bekommen, und bei Player kann sie entfernt werden, wenn nur der Raum selbst, aber keine Player als Wurzelobjekte zum Marshaller kommen:

Listing 16.8: com/tutego/insel/xml/xml/jaxb/Room.java, Room

@XmlRootElement( namespace = "http://tutego.com/" )
public class Room
{
private List<Player> players = new ArrayList<Player>();

@XmlElement( name = "player" )
public List<Player> getPlayers()
{
return players;
}

public void setPlayers( List<Player> players )
{
this.players = players;
}
}

Zwei Annotationen kommen vor: Da Room der Start des Objektgraphen ist, trägt es @XmlRootElement. Als Erweiterung ist das Element namespace für den Namensraum gesetzt, da bei eigenen XML-Dokumenten immer ein Namensraum genutzt werden soll. Weiterhin ist eine Annotation @XmlElement am Getter getPlayers() platziert, um den Namen des XML-Elements zu überschreiben, damit das XML-Element nicht <players> heißt, sondern <player>.

Kommen wir abschließend zu einem Beispiel, das einen Raum mit zwei Spielern aufbaut und diesen Raum dann in eine XML-Datei schreibt. Statt allerdings JAXBContext direkt zu nutzen und einen Marshaller zum Schreiben und Unmarshaller zum Lesen zu erfragen, kommt im zweiten Beispiel die Utility-Klasse JAXB zum Einsatz, die ausschließlich statische überladene marshal()- und unmarshal()-Methoden anbietet:

Listing 16.9: com/tutego/insel/xml/jaxb/RoomMarshaller.javal, main()

Player john = new Player();
john.setName( "John Peel" );

Player tweet = new Player();
tweet.setName( "Zwitscher Zoe" );

Room room = new Room();
room.setPlayers( Arrays.asList( john, tweet ) );

File file = new File( "room.xml" );
JAXB.marshal( room, file );

Room room2 = JAXB.unmarshal( file, Room.class );

System.out.println( room2.getPlayers().get( 0 ).getName() ); // John Peel

file.deleteOnExit();

Falls etwas beim Schreiben oder Lesen misslingt, werden die vorher geprüften Ausnahmen in einer DataBindingException ummantelt, die eine RuntimeException ist.

Die Ausgabe ist:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:room xmlns:ns2="http://tutego.com/">
<player>
<name>John Peel</name>
</player>
<player>
<name>Zwitscher Zoe</name>
</player>
</ns2:room>

Da beim Spieler das Geburtsdatum nicht gesetzt war (null wird referenziert), wird es auch nicht in XML abgebildet.

class javax.xml.bind.JAXB
  • static void marshal(Object jaxbObject, File xml)
  • static void marshal(Object jaxbObject, OutputStream xml)
  • static void marshal(Object jaxbObject, Result xml)
  • static void marshal(Object jaxbObject, String xml)
  • static void marshal(Object jaxbObject, URI xml)
  • static void marshal(Object jaxbObject, URL xml)
  • static void marshal(Object jaxbObject, Writer xml)
    Schreibt das XML-Dokument in die angegebene Ausgabe. Im Fall von URI/URL wird ein HTTP-POST gestartet. Ist der Parametertyp String, wird er als URL gesehen und führt ebenfalls zu einem HTTP-Zugriff. Result ist ein Typ für eine XML-Transformation und wird später vorgestellt.
  • static <T> T unmarshal(File xml, Class<T> type)
  • static <T> T unmarshal(InputStream xml, Class<T> type)
  • static <T> T unmarshal(Reader xml, Class<T> type)
  • static <T> T unmarshal(Source xml, Class<T> type)
  • static <T> T unmarshal(String xml, Class<T> type)
  • static <T> T unmarshal(URI xml, Class<T> type)
  • static <T> T unmarshal(URL xml, Class<T> type)
    Rekonstruiert aus der gegebenen XML-Quelle den Java-Objektgraph.
Performance-Tipp

Den JAXBContext aufzubauen, kostet Zeit und Speicher. Er sollte daher für wiederholte Operationen gespeichert werden. Noch eine Information: Marshaller und Unmarshaller sind nicht thread-sicher; es darf keine zwei Threads geben, die gleichzeitig den Marshaller/Unmarshaller nutzen.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de