Sunday, December 14, 2014

Tutorial JaXB 2

JAXB (Java Architecture for XML Binding)




JAXB est une spécification qui permet de faire correspondre un document XML à un ensemble de classes et inversement via des marshaling/unmarshaling.
JAXB permet  de manipuler un document XML sans avoir à connaître XML ou la façon dont un document XML est traitée comme le cas avec SAX, DOM.

 La manipulation du document XML se fait en utilisant des objets précédemment générés à partir  d'une DTD pour JAXB 1.0 et d'un XSD pour JAXB 2.0.






Les fonctionnalités de JAXB 2.0 par rapport à JAXB 1.0

1.JAXB 2.0 support uniquement des schémas XML (les DTD ne sont plus supportées)
2.mise en oeuvre des annotations
3.assure la correspondance entre un schéma XML et le bean correspondant.
4.l'utilisation de fonctionnalités proposées par Java 5 notamment les generics et les énumérations.
5.le nombre d'entités générées est moins important : JAXB 2.0 génère une classe pour chaque complexType du schéma alors que JAXB 1.0 génère une interface et une classe qui implémente cette interface.


Les Apport de JAXB 2.0

En plus de son utilité principale, JAXB 2.0 propose d'atteindre plusieurs objectifs :
Être facile à utiliser pour consulter et modifier un document XML sans connaissance ni de XML ni de techniques de traitement de documents XML

S'assurer que la création d'un document XML à partir d'objets et retransformer ce document en objets donne le même ensemble d'objets.

Pouvoir valider un document XML ou les objets qui encapsulent un document sans avoir à écrire le document correspondant


Nous allons montrer un exemple comment travailler avec JAXB2

-La commande xjc

L'implémentation de référence fournit l'outil xjc pour générer les classes à partir d'un schéma XML.

xXjc Shema.xsd
L'outil xjc possède plusieurs options dont voici les principales



 voici le fichier XSD qu'on va utiliser 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="personne">
<xs:complexType>
<xs:sequence>
<xs:element ref="Nom"/>
<xs:element ref="Prénom"/>
<xs:element ref="Solde"/>
<xs:element ref="Deuxbras"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="loonguer">
<xs:simpleType>
<xs:restriction base="xs:byte">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="longueur">
<xs:simpleType>
<xs:restriction base="xs:byte">
<xs:enumeration value="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="doigs">
<xs:complexType>
<xs:sequence>
<xs:element ref="loonguer"/>
</xs:sequence>
<xs:attribute name="nom" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="d1"/>
<xs:enumeration value="d2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="couleur">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="blanche"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="cinqdoigts">
<xs:complexType>
<xs:sequence>
<xs:element ref="doigs" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="bras">
<xs:complexType>
<xs:sequence>
<xs:element ref="longueur"/>
<xs:element ref="couleur"/>
<xs:element ref="cinqdoigts"/>
</xs:sequence>
<xs:attribute name="id" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="droite"/>
<xs:enumeration value="gauche"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="Solde">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:enumeration value="97.2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Prénom">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="jean"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Personnes">
<xs:complexType>
<xs:sequence>
<xs:element ref="Numéro"/>
<xs:element ref="personne"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Numéro">
<xs:simpleType>
<xs:restriction base="xs:long">
<xs:enumeration value="70290956565"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Nom">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="suissi"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Deuxbras">
<xs:complexType>
<xs:sequence>
<xs:element ref="bras" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>



Exemple de classe pour creer un fichier xml :

public class TestMarshalling {
public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(Personnes.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_ENCODING, "windows-1252");
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
///////////////////////
ObjectFactory fabrique = new ObjectFactory();
Personnes pers = fabrique.createPersonnes();

Personne personne = fabrique.createPersonne();
personne.setSolde(new BigDecimal(5000));
personne.setNom("jean");
personne.setPrénom("sahbi");
Deuxbras deuxbras=fabrique.createDeuxbras();
Bras  bras=fabrique.createBras();
bras.setCouleur("blanche");
bras.setId("25");
bras.setLongueur(100);
    Cinqdoigts cinqdoigts=fabrique.createCinqdoigts();
List<Doigs> listdoigs=new Vector();
Doigs doig1=fabrique.createDoigs();
doig1.setLoonguer(1);
doig1.setNom("pouce");

listdoigs.add(doig1);
Doigs doig2=fabrique.createDoigs();
doig2.setLoonguer(2);

doig2.setNom("index");
listdoigs.add(doig2);

Doigs doig3=fabrique.createDoigs();
doig3.setLoonguer(3);

doig3.setNom("le majeur");
listdoigs.add(doig3);
Doigs doig4=fabrique.createDoigs();
doig4.setLoonguer(4);

doig4.setNom("l'annulaire");
listdoigs.add(doig4);
Doigs doig5=fabrique.createDoigs();
doig5.setLoonguer(5);

doig5.setNom("l'auriculaire");
listdoigs.add(doig5);
cinqdoigts.getDoigs().addAll(listdoigs);
/////
bras.setCinqdoigts(cinqdoigts) ;

deuxbras.getBras().add(bras);
personne.setDeuxbras(deuxbras);

pers.setNuméro(0736512);
pers.setPersonne(personne);

m.marshal(pers, System.out);
// écriture finale du document XML dans un fichier surcouf.xml
   m.marshal(pers, new File("c:\\PersonGenerated.xml")) ;

} catch (JAXBException ex) {
ex.printStackTrace();
}
}
}



Exemple de classe pour lire un fichier xml  avec jaxb2:

public class TestUnMarshalling {
public static void main(String[] args) throws JAXBException {

   //Création d'un contexte JAXB sur la classe Personne
   JAXBContext context = JAXBContext.newInstance(Personnes.class) ;
  // Création d'un unmarshaller
   Unmarshaller unmarshaller = context.createUnmarshaller() ;
   Personnes personne = (Personnes)unmarshaller.unmarshal(new File("c:\\PersonGenerated.xml")) ;
    System.out.println("numero =" + personne.getNuméro()) ;
   System.err.println("Nom = " + personne.getPersonne().getNom()) ;
   System.out.println("Solde = " + personne.getPersonne().getSolde()) ;
   System.err.println("lognguerur doig = " + personne.getPersonne().getDeuxbras()
.getBras().get(0)
.getCinqdoigts()
.getDoigs().get(0).getLoonguer()) ;


}

No comments:

Post a Comment