I have joined Anti-IF Campaign

Xml et Jaxb sont dans un bateau : génération et référence interne.

Xml et Jaxb sont dans un bateau : génération et référence interne.

Que celui qui n'a jamais utiliser de fichier Xml jette la première pierre ;-) .
Il peut être intéressant de créer un fichier Xml pour des besoins particuliers comme la configuration ou la description des éléments complexes.
Pour définir proprement sa structure, permettre sa validation et faciliter son édition, il faut en passer par un schéma xsd.


1ere étape : définition de notre schéma xsd
Nous allons partir d'un exemple simple : décrire des clients (customer) et des commandes (order).
Dans cet exemple, les clients ont leur existence propre.
Les commandes font quant à elles référence à un client.
Plusieurs commandes peuvent donc faire référence à un même client.
Comment mettre en place cette notion de référence en xml ?
Tout simplement en utilisant id et idref.
Voici donc notre schéma :
Chargement ....
Une livraison (delivery) contiendra donc une liste de clients et une liste de commandes.
Un client sera identifié par un id de type "xsd:ID" et un nom (name).
La commande pour sa part est rattachée à un et un seul client grâce à la propriété "customerRef" de type "xsd:IDREF".

Il faut noter que le pattern à utiliser pour l'id est précis (voir NT-NCName dans les références).
Il faut ainsi que cet id commence par une lettre exemple : C124.

Voici un exemple de fichier xml respectant le schéma :
Chargement ....

2eme étape : utilisation du fichier Xml depuis Java
Il ne reste plus qu'à utiliser ce fichier Xml depuis notre programme java.
Pour cela, java propose une spécification : la jsr222 et le Jdk intègre l'implémentation de référence facilitant ce travail :
JAXB 2.0 (Java Architecture for XML Binding).
L'API JAXB facilite l'utilisation du XML en Java en générant des classes Java à partir d'un schéma et inversement.
L'implémentation de référence JAXB RI est actuellement en version 2.2.6.

Nous allons nous appuyer sur JAXB pour générer les classes java correspondantes.
Pour cela rien de plus simple, en ligne de commande lançons la commande suivante :
Chargement ....
Et voila, 4 classes ont été créées :
- une classe ObjectFactory permettant de créer des instances des différentes entités définies.
- une classe DeliveryType pour le binding avec l'élément livraison (delivery)
- une classe CustomerType pour le binding avec l'élément client (customer)
- une classe OrderType pour le binding avec l'élément commande (order)

3eme étape : le test
Pour nous assurer du bon fonctionnement de la référence, rien de mieux qu'un test junit.
Dans ce test, on va charger notre Xml d'exemple et valider que le client rattaché à la commande a bien le nom "toto".
Chargement ....
Conclusion
Jaxb c'est de la balle et c'est inclue dans le jdk.
C'est une api à creuser qui s'intègre bien à maven.

Les références montrent la puissance du Xml, technologie mature s'il en est.
Elles sont aussi implémentables grâce à key et keyref mais je n'ai pas encore testé.

Toutes les sources sont accessibles depuis Github : Github Xml IdRef With Jaxb
A bientôt.

Les références :
jaxb.java.net
XML_Schema
JSR222
NT-NCName
jmdoudoux jaxb

Aucun commentaire:

Enregistrer un commentaire