Vous êtes sur la page 1sur 33

Java - XML Binding

Didier DONSEZ
Université Joseph Fourier (Grenoble 1)
IMA – IMAG/LSR/ADELE
'LGLHU'RQVH]#LPDJIU

2

Sommaire

■ Rappel XML
■ Objectif
■ Outils
• JAXB
• java.beans.XMLDecoder/XMLEncoder
• Castor
• XMLBeans
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• Zeus
• JDOM

3

XML - Extensible Markup Language

■ Document semi-structuré
• Bien formé
• Valide (respecte une structure DTD ou XML Schema)
■ Exemple
"[PO YHUVLRQ "!
86$GGUHVV!
QDPH!$OLFH6PLWKQDPH!
VWUHHW!+XQWLQJWRQ$YHVWUHHW!
FLW\!%RVWRQFLW\!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

VWDWH!0$VWDWH!
]LS!]LS!
86$GGUHVV!

4

DTD - document type definition

■ Héritage de SGML
■ Exemple
'2&7<3(86$GGUHVV >
(/(0(1786$GGUHVV QDPHVWUHHWFLW\VWDWH]LS !
(/(0(17QDPH 3&'$7$ !
(/(0(17VWUHHW 3&'$7$ !
(/(0(17FLW\ 3&'$7$ !
(/(0(17VWDWH 3&'$7$ !
(/(0(17]LS 3&'$7$ !
@!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

■ Critiques
• pas de typage, pas de cardinalité, pas d’imbrication, …

5

XML Schema (W3C)

■ Typage, Cardinalité, Imbrication, Modularité


• XSI : types simples
• XSD: types complexes (structuré)
'LGLHU'RQVH]-DYD;0/ELQGLQJ

6

XML Schema (W3C)


[VGVFKHPD
[POQV[VG KWWSZZZZRUJ;0/6FKHPD
[POQV KWWSZZZP\FRPSFRP;0/6FKHPDP\W\SHV!
[VGHOHPHQWQDPH ]LSFRGH!
[VGVLPSOH7\SH!
[VGUHVWULFWLRQEDVH [VGVWULQJ!
[VGSDWWHUQYDOXH >@^` >@^` "!
[VGUHVWULFWLRQ!
[VGVLPSOH7\SH!
[VGHOHPHQW!
[VGHOHPHQWQDPH 86$GGUHVV!
[VGFRPSOH[7\SH!
[VGVHTXHQFH!
[VGHOHPHQWQDPH QDPH W\SH [VGVWULQJ!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

[VGHOHPHQWQDPH VWUHHW W\SH [VGVWULQJ!


[VGHOHPHQWQDPH FLW\ W\SH [VGVWULQJ!
[VGHOHPHQWQDPH VWDWH W\SH [VGVWULQJ!
[VGHOHPHQWQDPH ]LS W\SH ]LSFRGH!
[VGVHTXHQFH!
[VGFRPSOH[7\SH!
[VGHOHPHQW!
[VGVFKHPD!

7

Remarques sur XML

■ Représentation de documents semi-structurés


• Donc très polymorphe (nombreuses alternatives de
représentation)
■ Graphe de données (en DTD)
• Attribut de type ID :
• L’élément est identifié de manière unique (portée : le document)
• Attribut de type IDREF, IDREFS :
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• Référence un élément identifié (ID)


• Pas de typage des références
■ Références (intra-extra document)
• Xlink, Xpointer

8

Manipulation XML depuis Java

■ SAX - Simple API for XML


• Interface événementielle
■ DOM - Document Object Model
• Interface navigationnelle dans un arbre
■ XML Data-Binding (JSR-031)
'LGLHU'RQVH]-DYD;0/ELQGLQJ

9

Objectif du Binding XML - Java


FRPSLOHJpQqUH
6FKHPD;0/
&ODVVH-DYD
'7'
FRQYHUWLW

0DSSLQJ
'LGLHU'RQVH]-DYD;0/ELQGLQJ

UHVSHFWH LQVWDQFHGH

8QPDUVKDO
'RFXPHQW;0/ YDOLGDWLRQ 2EMHW-DYD
PDUVKDO

10

Usage

■ Fichiers de configuration, de déploiement, …


• Web apps, EJB, Manifest XML …
■ Persistance Objet Java
■…
■ Web Services
• Rappel SOAP
• Les paramêtres et résultats des requêtes sont encodés en XML
;0/6FKHPD, XMI, …
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• Rappel WSDL
• Les champs de messages sont des types XML Schema
• Désérialisation/Sérialisation
• Java vers/depuis les paramètres des messages SOAP

11
Exemple de classe Java générée
à partir d’un schéma ou d’une DTD
■ Exemple
SXEOLFFODVV86$GGUHVV ^
SXEOLF86$GGUHVV 6WULQJQDPH6WULQJVWUHHW6WULQJFLW\
6WULQJVWDWH6WULQJ]LS ^«`
SXEOLF6WULQJJHW1DPH ^«`
SXEOLFYRLGVHW1DPH 6WULQJQDPH ^«`
SXEOLF6WULQJJHW6WUHHW ^«`
SXEOLFYRLGVHW6WUHHW 6WULQJVWUHHW ^«`
««
SXEOLFYRLGPDUVKDO 2XWSXW6WUHDP RXW WKURZV,2([FHSWLRQ ^«`
'LGLHU'RQVH]-DYD;0/ELQGLQJ

SXEOLFVWDWLF86$GGUHVVXQPDUVKDO ,QSXW6WUHDP LQ
WKURZV,2([FHSWLRQ ^«`
«6$;'20«
`

12

Exemple d’usage

File f = new File("address.xml");


FileInputStream fis = new FileInputStream(f);
AddressUS a=USAddress.unmarshal(fis);
fis.close();

a.setName="Alice Dow";
'LGLHU'RQVH]-DYD;0/ELQGLQJ

FileOutputStreamfos = new FileOutputStream(f);


a.marshal(fos));
fis.close();

13

Outils

■ Type
• Génération à la conception
• Possibilité de configurer les champs à lier, …
• Génération à la Exécution
• Pas de configuration
■ Procédé
• Automatique (conception, exécution)
• Se base sur l’introspection Java, JavaBeans (setter/getter)
• Manuelle (conception)
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• GUI, …
■ Cibles
• Tout objet Java
• Sous typage d’une classe racine (EJB, …)
• JavaBeans seulement

14

Outils

■ Type (2)
• Centré Document
• Générer des classes Java à partir de tout type de document
DOM +/- API propriétaire
• Centré Objet
• Générer des schémas XML et DTD à partir de toute classe Java
DTDs et XML Schémas propriétaires
• Centré Données
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• Représente une information en XML Schéma et par une/des classes


Java

15

Outils

■ Conception
• VB, C#, C++ (Microsoft COM ou .NET)
• .NET, SchemaCoder
• Java
• Exolab’s Castor http://castor.exolab.org/
• Sun’s JAXB
• ObjectWeb JORM ??
• ZOPE, Zeus (enhydra), Schema2Java, Oracle XML, Informix, …
'LGLHU'RQVH]-DYD;0/ELQGLQJ

■ Exécution
• J2SE1.4 java.beans.XMLEncoder/XMLDecoder
• XMLConverter, JSX, …

16

JAXB (SUN)

■ Génération de classes Java à partir


• de la DTD
• d’ un fichier de correspondance (binding schema) (.xjs)

■ Remarque
• Early Access
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• Succeptible de bouger et d’ utiliser XML Schema plutôt que la


DTD !

17

Exemple de fichier XML à unmarshaller


"[PO YHUVLRQ  HQFRGLQJ ,62"!
'2&7<3( WUDGHEDWFK6<67(0WUDGHEDWFKGWG!
WUDGHEDWFK! classe
WUDGHDFFRXQW DFWLRQ VHOO!
classe
V\PERO!681:V\PERO!
attribut
TXDQWLW\!TXDQWLW\!
OLPLW!OLPLW!
GDWH!GDWH!
WUDGH!
WUDGHDFFRXQW DFWLRQ EX\!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

V\PERO!&6&2V\PERO!
TXDQWLW\!TXDQWLW\!
GDWH!GDWH!
WUDGH!
WUDGHEDWFK!

18

Les DTDs
(/(0(17 WUDGH V\PERO TXDQWLW\ OLPLW"GDWH !

$77/,67 WUDGH
DFFRXQW &'$7$5(48,5('
DFWLRQ EX\ _ EX\WRFRYHU _ VHOO _ VHOOVKRUW 5(48,5('
!

(/(0(17 V\PERO 3&'$7$ !


(/(0(17 TXDQWLW\ 3&'$7$ !
(/(0(17 OLPLW 3&'$7$ !
(/(0(17GDWH 3&'$7$ !
'LGLHU'RQVH]-DYD;0/ELQGLQJ

(17,7< WUDGH 6<67(0WUDGHGWG!


WUDGH

(/(0(17 WUDGHEDWFK WUDGH !



19

Le fichier de binding (i)

[POMDYDELQGLQJVFKHPD YHUVLRQ HD!

± &RQYHUWLVVHXUGHW\SH-DYD!
FRQYHUVLRQ QDPH SULFHW\SH MDYDPDWK%LJ'HFLPDO!
FRQYHUVLRQ QDPH GDWHW\SH MDYDXWLO'DWH
SDUVH &QYSDUVH'DWH SULQW &QYSULQW'DWH
!

 $WWULEXWV-DYD!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

HOHPHQWQDPH V\PEROW\SH YDOXH!


HOHPHQWQDPH TXDQWLW\W\SH YDOXH FRQYHUW LQW!
HOHPHQWQDPH OLPLWW\SH YDOXH FRQYHUW SULFH!
HOHPHQWQDPH GDWHW\SH YDOXH FRQYHUW GDWH!
«

20

Le fichier de binding (ii)


 /HVFODVVHV-DYDHWOHXUVDWWULEXWV!
HOHPHQWQDPH WUDGHW\SH FODVV URRW WUXH!
FRQWHQW!
HOHPHQWUHIQDPH V\PERO!
HOHPHQWUHIQDPH TXDQWLW\!
HOHPHQWUHIQDPH OLPLW SURSHUW\ OLPLWSULFH!
HOHPHQWUHIQDPH GDWH!
FRQWHQW!
HQXPHUDWLRQQDPH $FWLRQPHPEHUV EX\EX\WRFRYHUVHOOVHOOVKRUW!
DWWULEXWHQDPH DFFRXQW FRQYHUW LQW!
DWWULEXWHQDPH DFWLRQ!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

HOHPHQW!

HOHPHQWQDPH WUDGHEDWFKW\SH FODVV URRW WUXH!


FRQWHQW SURSHUW\ 7UDGHV!
HOHPHQW!
[POMDYDELQGLQJVFKHPD!

21

Classe de conversion

public class Cnv {


private static java.text.SimpleDateFormat df
= new java.text.SimpleDateFormat("yyyy-MM-dd");
public static java.util.Date parseDate(String s)
throws java.text.ParseException {
return df.parse(s);
}
'LGLHU'RQVH]-DYD;0/ELQGLQJ

public static String printDate(java.util.Date d) {


return df.format(d);
}
}

23

Utilisation

■ Génération des classes Trade et Trades (+ sous classes)


• $JAXBHOME/bin/xjc trade-batch.dtd trade-batch.xjs
■ Appel au marshaller/unmarshaller
LPSRUWMDYDLR 
LPSRUW MDYD[[POELQG 

SXEOLFFODVV 7UDGH/LVWHU ^
SXEOLF VWDWLFYRLG PDLQ 6WULQJ>@ DUJV WKURZV ([FHSWLRQ^
'LVSDWFKHUG 7UDGHQHZ'LVSDWFKHU 
'LGLHU'RQVH]-DYD;0/ELQGLQJ

2EMHFWRE GXQPDUVKDO QHZ)LOH,QSXW6WUHDP QHZ)LOH DUJV>@ 


6\VWHPRXWSULQWOQ RE 
`
`

24

java.beans.XMLDecoder/XMLEncoder

■ Codage/Décodage automatique d’objets Java


• Depuis J2SE 1.4
■ Exemple codage
-)UDPHMI QHZ-)UDPH 6DPSOH ;0/(QFRGHU 
«
MIDGG QHZ -%XWWRQ +HOORZRUOG 
;0/(QFRGHUH QHZ;0/(QFRGHU QHZ)LOH2XWSXW6WUHDP 7HVW[PO 
HZULWH2EMHFW MI HFORVH 
'LGLHU'RQVH]-DYD;0/ELQGLQJ

■ Exemple codage
;0/'HFRGHUG QHZ;0/'HFRGHU QHZ)LOH,QSXW6WUHDP 7HVW[PO 
2EMHFWUHVXOW GUHDG2EMHFW GFORVH 
-)UDPHMI -)UDPH UHVXOW

25

java.beans.XMLDecoder/XMLEncoder

■ Fiche Test.xml
"[PO YHUVLRQ  HQFRGLQJ 87)"!
MDYDYHUVLRQ FODVV MDYDEHDQV;0/'HFRGHU!
REMHFW FODVV MDYD[VZLQJ-)UDPH!
YRLGSURSHUW\ QDPH!VWULQJ!6DPSOH ;0/(QFRGHUVWULQJ!YRLG!
YRLGSURSHUW\ ERXQGV!
REMHFW FODVV MDYDDZW5HFWDQJOH!
LQW!LQW!LQW!LQW!LQW!LQW!LQW!LQW!
REMHFW!
YRLG!
YRLGSURSHUW\ FRQWHQW3DQH!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

YRLGPHWKRG DGG!
REMHFW FODVV MDYD[VZLQJ-%XWWRQ!
YRLGSURSHUW\ ODEHO!VWULQJ!+HOOR:RUOGVWULQJ!YRLG!
REMHFW!
YRLG!
YRLG!
YRLGSURSHUW\ YLVLEOH!ERROHDQ!WUXHERROHDQ!YRLG!
REMHFW!MDYD!

26

Castor (Exolab)

■ Générateur de classes Java à partir


• de schémas XML (XSD)
■ Mapping (format XML)
• Définit une correspondance (conversion)
entre une structure XML et une classe Java H[LVWDQWH.
• Patrimonial / Legacy
'LGLHU'RQVH]-DYD;0/ELQGLQJ

■ Également JDO, DSML, …



27

Marshal/Unmarshal dans Castor

class org.exolab.castor.xml.Marshaller … {
static void marshal(Object obj, DocumentHandler handler); // SAX
static void marshal(Object obj, Node node); // DOM
static void marshal(Object obj, Writer writer); // File

}
class org.exolab.castor.xml.Unmarshaller … {
Object unmarshall(EventProducer events); // SAX
'LGLHU'RQVH]-DYD;0/ELQGLQJ

static Object unmarshall(Class cls, Node node); // DOM


static Object unmarshall(Class cls, Reader reader) // File
static Object unmarshall(Class cls, InputSource) // File

}

28

Castor
 &UHDWH DQHZ 3HUVRQ
3HUVRQSHUVRQ QHZ 3HUVRQ $OLFH6PLWK 
SHUVRQVHW'DWH2I%LUWK QHZ'DWH  

 &UHDWH D)LOHWRPDUVKDOWR
ZULWHU QHZ )LOH:ULWHU SHUVRQ[PO 

0DUVKDO WKHSHUVRQREMHFW
0DUVKDOOHUPDUVKDO SHUVRQ ZULWHU 
'LGLHU'RQVH]-DYD;0/ELQGLQJ

&UHDWH D 5HDGHU WR WKH ILOHWR XQPDUVKDOIURP


UHDGHU QHZ )LOH5HDGHU SHUVRQ[PO 

0DUVKDO WKHSHUVRQREMHFW
3HUVRQSHUVRQ  3HUVRQ 8QPDUVKDOOHUXQPDUVKDO 3HUVRQFODVV UHDGHU 
SHUVRQVHW1DPH $OLFH'RZ 

29

Castor - Mapping

• Définit une correspondance


entre une structure XML et une classe Java existante.
PDSSLQJ!
FODVV QDPH P\SDFNDJH3HUVRQ!
PDSWR [PO HPSOR\HH!
SDFNDJH P\SDFNDJH
ILHOGQDPH LGHQW
SXEOLFFODVV3HUVRQ ^
HPSOR\HH GLUHFW WUXH!
SXEOLF LQWLGHQW
VRFQXP ! ELQG[POQDPH VRFQXP
SXEOLF6WULQJQDPH
QRP! QRGH DWWULEXWH!
SXEOLF6WULQJJHW1DPH
$OLFH'RZ ILHOG!
'LGLHU'RQVH]-DYD;0/ELQGLQJ

^UHWXUQQDPH`
QRP! ILHOGQDPH QDPH!
SXEOLF YRLGVH1DPH
HPSOR\HH! ELQG[POQDPH QRP
6WULQJQDPH
QRGH HOHPHQW!
^WKLVQDPH QDPH`
ILHOG!
`
FODVV!
PDSSLQJ!

30

Castor - Mapping

 /RDG0DSSLQJ
0DSSLQJPDSSLQJ QHZ 0DSSLQJ 
PDSSLQJORDG0DSSLQJ PDSSLQJ[PO 

 &UHDWH D 5HDGHU WR WKH ILOHWR XQPDUVKDOIURP


UHDGHU QHZ )LOH5HDGHU HPSOR\HH[PO 

 &UHDWH DQHZ 8QPDUVKDOOHU


'LGLHU'RQVH]-DYD;0/ELQGLQJ

8QPDUVKDOOHUXQPDUVKDOOHU QHZ 8QPDUVKDOOHU 3HUVRQFODVV 


XQPDUVKDOOHUVHW0DSSLQJ PDSSLQJ 
 8QPDUVKDOWKHSHUVRQREMHFW
3HUVRQSHUVRQ  3HUVRQ XQPDUVKDOOHUXQPDUVKDO UHDGHU 

31

Apache XMLBeans
KWWS[POEHDQVDSDFKHRUJ
■ Basé sur XML Schema
• Full XML Schema support.
• Full XML Infoset fidelity.
■ 3 API
• XmlObject
• The java classes that are generated from an XML Schema are all derived
from XmlObject. These provide strongly typed getters and setters for each of
the elements within the defined XML. Complex types are in turn
XmlObjects.
• XmlCursor
'LGLHU'RQVH]-DYD;0/ELQGLQJ

• From any XmlObject you can get an XmlCursor. This provides efficient, low
level access to the XML Infoset. A cursor represents a position in the XML
instance.
• SchemaType
• XMLBeans provides a full XML Schema object model that you can use to
reflect on the underlying schema meta information.

32

ObjectWeb Zeus (http://zeus.objectweb.org/)

■ DTD et XML Schema


■ Pluggable constraints
'LGLHU'RQVH]-DYD;0/ELQGLQJ

33

JDOM (http://www.jdom.org/)

■ TODO
'LGLHU'RQVH]-DYD;0/ELQGLQJ

34

Ressources

■ http://www.rpbourret.com/xml/XMLDataBinding.htm

■ Chapitre 15
• http://www.wrox.com/Support/PDF/SampleChapter_5059.pdf
'LGLHU'RQVH]-DYD;0/ELQGLQJ

Vous aimerez peut-être aussi