JAXB Tutorial

Mit Hilfe der Java Architecture for XML Binding (JAXB) API können Java Objekte bequem in XML-Dokumente gewandelt werden und umgekehrt. Über Annotations teilen hierbei die Entwickler dem Compiler mit, welcher Klasse oder welches Attribut welche Eigenschaft in dem XML-Dokument übernehmen wird.
Bereits in dem Tutorial Java und XML Tutorial wurde die Bearbeitung von XML-Dokumenten auf Basis eines Literatur Beispiels gezeigt. Dieses Beispiel werde ich nun mit Hilfe von JAXB erneut aufgreifen.

Mehr Informationen über das Thema XML gibt es in dem Blogbeitrag XML – Extensible Markup Language. Zusatztechnologien wie zum Beispiel XPath, XPointer, oder XLink behandelt der Beitrag XML Zusatztechnologien.

Annotations

Eine kleine Übersicht der verwendeten Annoations mit ihren Funktionen.

Annotation Funktion
@XmlRootElement(namespace = „http://www.itblogging.de/myNameSpace“) Kennzeichnet das Root Element. Die Angabe des Namensraums ist optional.
@XmlElement(name = „myName“) Gibt dem XML Element einen alternativen Namen, falls gewünscht.
@XmlType(propOrder = {„title“, „isbn“}) Bestimmt die Reihenfolge der Ausgabe.
@XmlElementWrapper(name = „authorlist“) Erzeugt einen Wrapper um eine Liste von Objekten.
@XmlSchemaType(name = „dateTime“) Anhagabe des Typen.

Author.java

Die Author Klasse ist eine ganz normale Bean Klasse. Es werden keine Annotations zur Kennzeichnung besonderer Attribute benötigt.

public class Author
{
  private String firstName;
  private String lastName;

  public String getFirstName()
  {
    return firstName;
  }

  public void setFirstName(String firstName)
  {
    this.firstName = firstName;
  }

  public String getLastName()
  {
    return lastName;
  }

  public void setLastName(String lastName)
  {
    this.lastName = lastName;
  }
}

Edition.java

Hier ein Beispiel der @XmlElement Annotation. Normalerweise würde das XML-Tag nach der Generierung den Namen „editionNo“ erhalten. Statt „editionNo“ wird das Tag dank der Annotation den Namen „numberOfEdition“ erhalten.

import javax.xml.bind.annotation.XmlElement;

public class Edition
{
  private String publisher;
  private int editionNo;
  private int publicationYear;

  public String getPublisher()
  {
    return publisher;
  }

  public void setPublisher(String publisher)
  {
    this.publisher = publisher;
  }

  public int getEditionNo()
  {
    return editionNo;
  }

  @XmlElement(name = "numberOfEdition")
  public void setEditionNo(int editionNo)
  {
    this.editionNo = editionNo;
  }

  public int getPublicationYear()
  {
    return publicationYear;
  }

  public void setPublicationYear(int publicationYear)
  {
    this.publicationYear = publicationYear;
  }
}

Book.java

Über das Attribut propOrder der @XmlType Annotation kann die Reihenfolge der Ausgabe bestimmt werden. Einige Tagnamen werden mit Hilfe der @XmlElement neu vergeben.
Die Annotation @XmlElementWrapper ummantelt alle Autoren mit einem weiteren Tag, dem authorlist Tag.

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlType;

// Property Reihenfolge mit "propOrder" bestimmen
@XmlType(propOrder = {"title", "isbn", "edition", "authors"})
public class Book
{
    private String title;
    private List<Author> authors;
    private Edition edition;
    private String isbn;

    public Book()
    {
      this.authors = new ArrayList<Author>();
    }

    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    public void addAuthor(Author a)
    {
        authors.add(a);
    }

    @XmlElementWrapper(name = "authorlist")
    @XmlElement(name = "author")
    public List<Author> getAuthors()
    {
        return authors;
    }

    public void setEdition(Edition edition)
    {
      this.edition = edition;
    }

    @XmlElement(name = "editionInfo")
    public Edition getEdition()
    {
        return edition;
    }

    public String getIsbn()
    {
        return isbn;
    }

    public void setIsbn(String isbn)
    {
        this.isbn = isbn;
    }
}

Literature.java

Die Annotation @XmlRootElement kennzeichnet das Wurzelelement des XML-Dokumentes. Optional kann der Namensraum angegeben werden.

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;

// Angabe des Root Elements. Optional kann der namespace -sofern er vorhanden
// ist- angegeben werden.
@XmlRootElement(namespace = "http://www.itblogging.de/myNameSpace")
@XmlType(propOrder = {"currentTime", "bookList"})
public class Literature
{
  private List<Book> bookList;
  private Date currentTime;
  private String version;

  public Literature()
  {
    this.bookList = new ArrayList<Book>();
  }

  // Der Wrapper soll "booklist" heißen
  @XmlElementWrapper(name = "booklist")
  // und die einzelnen Elemente jeweils "book"
  @XmlElement(name = "book")
  public List<Book> getBookList()
  {
    return bookList;
  }

  // explizite Typenangabe
  @XmlSchemaType(name = "dateTime")
  public Date getCurrentTime()
  {
    return currentTime;
  }

  public void setCurrentTime(Date currentTime)
  {
    this.currentTime = currentTime;
  }

  // Die Version soll ein Attribut des RootElements sein
  @XmlAttribute
  public String getVersion()
  {
    return version;
  }

  public void setVersion(String version)
  {
    this.version = version;
  }
}

XMLCreator.java

Diese Klasse hilft uns ein neues XML-Dokument zu erzeugen, auszugeben, zu speichern und anschließend erneut wieder einzulesen.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Date;

import javax.xml.bind.JAXB;

public class XmlCreator
{
  public static void main(String[] args) throws IOException
  {
    Literature literature = createLiterature();

    // Konsolenausgabe
    JAXB.marshal(literature, System.out);

    // Dateiname (wird in dem Projektverzeichnis hinterlegt)
    String fileName = "literatur.xml";

    // Speicherung in Datei
    Writer fileWriter = new FileWriter(fileName);
    JAXB.marshal(literature, fileWriter);
    fileWriter.close();

    // Aus Datei lesen
    Literature backToObject = JAXB.unmarshal(new File(fileName), Literature.class);

    System.out.println("\nVersion: " + backToObject.getVersion());
    System.out.println("Datum: " + backToObject.getCurrentTime());
    System.out.println("---");
    for(Book book : backToObject.getBookList())
    {
      System.out.println("Titel: " + book.getTitle());
      System.out.println("ISBN: " + book.getIsbn());
      // ....
    }
  }

  // Erzeugt das Literaturverzeichnis
  private static Literature createLiterature()
  {
    Literature literature = new Literature();
    literature.setCurrentTime(new Date());
    literature.setVersion("0.1");

    // Book
    Book book = new Book();
    book.setIsbn("3-89842-488-X");
    book.setTitle("Einstieg in XML");

    // Edition
    Edition edition = new Edition();
    edition.setEditionNo(2);
    edition.setPublicationYear(2004);
    edition.setPublisher("Galileo Computing");
    book.setEdition(edition);

    // Author
    Author author = new Author();
    author.setFirstName("Helmut");
    author.setLastName("Vonhoegen");
    book.getAuthors().add(author);

    // Buch hinzufügen
    literature.getBookList().add(book);

    return literature;
  }
}

Ergebnis

Nachdem die Datei XMLCreator.java ausgeführt wurde, wird zum einen das Ergebnis in der Konsole ausgegeben und zum anderen in der neu angelegten Datei literature.xml gespeichert.
Man beachte, dass die Tagnamen wie vorgeschrieben benannt wurden.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:literature xmlns:ns2="http://www.itblogging.de/myNameSpace"
	version="0.1">
	<currentTime>2012-04-09T20:39:52.364+02:00</currentTime>
	<booklist>
		<book>
			<title>Einstieg in XML</title>
			<isbn>3-89842-488-X</isbn>
			<editionInfo>
				<numberOfEdition>2</numberOfEdition>
				<publicationYear>2004</publicationYear>
				<publisher>Galileo Computing</publisher>
			</editionInfo>
			<authorlist>
				<author>
					<firstName>Helmut</firstName>
					<lastName>Vonhoegen</lastName>
				</author>
			</authorlist>
		</book>
	</booklist>
</ns2:literature>

Das JAXB Tutorial steht auch als zip-Datei zum Download zur Verfügung.