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
<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