JAXB est une spécification permettant la correspondance d'un document XML à un ensemble de classes et inversement au moyen d'opérations de sérialisation/désérialisation nommées marshalling/unmarshalling.
Dans cet article nous allons voir comment utiliser JAXB 2.0 (Java Architecture for XML Binding) pour manipuler ces documents XML.
JAXB permet la manipulation de documents XML sans pour autant avoir à les manipuler directement. En effet, les données manipulées seront les classes java où seront importées les données (désérialisation => unmarshalling) et exportées (sérialisation => marshalling) dans des fichiers.
JAXB permet également la création automatique des entités java gâce au schéma XML (fichier xsd) et inversement.
Le fichier XSD suivant sera pris pour exemple dans cet article :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.laulem.com/jaxb">
<xs:element name="library">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element name="firstName" type="xs:string" />
<xs:element name="lastName" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Afin de générer les classes annotées et donc d'obtenir un mapping avec le fichier xsd, utiliser la commande xjc :
xjc library.xsd
Options de la commande :
option | Rôle |
-p nom_package |
Package contenant les classes générées |
-d répertoire |
Répertoire contenant les classes générées |
-nv |
Supprime la validation du schéma |
Dans le fichier pom.xml, insérer les dépendances suivantes :
<dependencies>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.3</version>
<scope>runtime</scope>
</dependency>
</dependencies>
Les dépendances ci-dessus sont indispenssable depuis java 11 car java.xml.bind a été supprimé dans cette version et déprécié depuis java 9. Sans, les classes générées ne sont pas utilisables.
Dans le pom.xml insérer le plugin suivant :
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<sources>
<source>src/main/resources/schema.xsd</source>
</sources>
<packageName>src.main.resources</packageName>
</configuration>
</execution>
</executions>
</plugin>
Insérer le fichier XSD contenant le schéma (ici nommé schema.xsd) dans le dossier src/main/resources/. C'est ce plugin qui permet la génération automatique des classes.
Remarque : Pour une utilisation du projet avec Eclipse, il est nécessaire d'ajouter les nouvelles sources dans le projet. Pour ce faire, aller dans les propriétés du projet, puis dans Java Build Path > Source et ajouter le dossier target/generated-sources/jaxb.
Fichier XML importé (library.xml) positionné dans le dossier src/main/resources/ :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:library xmlns:ns2="http://www.laulem.com/jaxb">
<book>
<title>Java book</title>
<author>
<firstName>Alex</firstName>
<lastName>Lemaire</lastName>
</author>
</book>
</ns2:library>
Exemple d'import :
try {
final JAXBContext jc = JAXBContext.newInstance("src.main.resources");
final Unmarshaller unmarshaller = jc.createUnmarshaller();
final Library library = (Library) unmarshaller.unmarshal(
new File("src/main/resources/library.xml"));
final List<Book> livres = library.getBook();
for (final Book book : livres) {
System.out.println("Book ");
System.out.println("Title : " + book.getTitle());
System.out.println("Author : " + book.getAuthor().getFirstName()
+ " " + book.getAuthor().getLastName());
System.out.println();
}
} catch (final Exception e) {
e.printStackTrace();
}
Exemple d'export :
try {
final JAXBContext context = JAXBContext.newInstance(Library.class);
final Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
final ObjectFactory fabrique = new ObjectFactory();
final Library bibliotheque = fabrique.createLibrary();
final Book book = fabrique.createLibraryBook();
final Author author = fabrique.createLibraryBookAuthor();
author.setFirstName("Alex");
author.setLastName("Lemaire");
book.setAuthor(author);
book.setTitle("Java book");
bibliotheque.getBook().add(book);
m.marshal(bibliotheque, System.out);
} catch (final Exception e) {
e.printStackTrace();
}
Sortie :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:library xmlns:ns2="http://www.laulem.com/jaxb">
<book>
<title>Java book</title>
<author>
<firstName>Alex</firstName>
<lastName>Lemaire</lastName>
</author>
</book>
</ns2:library>
LauLem.com - Conditions Générales d'Utilisation - Informations Légales - Charte relative aux cookies - Charte sur la protection des données personnelles - A propos