Java Avance - XML par JDOM

Transcription

Java Avance - XML par JDOM
Plan
Java Avance
XML par JDOM
1
SAX et JDOM
2
Création de fichier
3
Sortie XML
4
Parser en XML
Emmanuel ADAM
5
Parcourir un document XML
LAMIH UMR CNRS 8530
Université de Valenciennes et du Hainaut-Cambrésis
FRANCE
6
Filtrage d’un document XML
25 mars 2008
7
Modification d’un document XML
8
Transformation d’un document XML
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
1 / 18
E. ADAM (University of Valenciennes)
SAX et JDOM
Java Avance
25 mars 2008
2 / 18
Création de fichier
JDOM et XML
Création d’un fichier XML
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
SAX
Création
SAX est l’acronyme de Simple API for XML.
Les noeuds d’un arbre XML sont appelés Element
Parseur utilisant des événements pour piloter le traitement d’un fichier XML
Un objet (handler) doit fournir les traitements à réaliser sur les fichiers XML
Le parseur appelle ces méthodes
Chaque Element peut posséder des propriétés (Attribute)
Chaque Element peut posséder des fils de type Elements
JDOM utilise des collections SAX pour parser les fichiers XML.
Exemple
DOM
DOM est l’acronyme de Document Object Model.
C’est une spécification du W3C pour proposer une API qui permet de
modéliser, de parcourir et de manipuler un document XML
rôle de DOM : fournir une représentation d’un document XML sous la forme
d’un arbre d’objets et permettre le parcours et la mise à jour).
DOM est indépendant du langage d’implémentation.
<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<menu>
< F r i t e s c l a s s e=” g r a s s e s ”>
<accompagnement> F r i c a d e l l e s</ accompagnement>
</ F r i t e s>
</menu>
Parseur DOM pour JAVA le plus répandu : Xerces
JDOM utilise DOM
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
3 / 18
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
4 / 18
Création de fichier
Sortie XML
Création d’un document XML par JDOM
Enregistrement / Affichage d’un fichier XML
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
i m p o r t o r g . jdom . ∗ ;
...
o r g . jdom . Document document ;
...
v o i d creerXML ( ) {
// R a c i n e = ”menu”
E l e m e n t r a c i n e = new E l e m e n t ( ”menu” ) ;
// C r e a t i o n d ’ un n o u v e a u Document JDOM b a sé s u r l a r a c i n e
document = new Document ( r a c i n e ) ;
// A j o u t d ’ un s o u s −noeud
E l e m e n t p l a t = new E l e m e n t ( ” F r i t e s ” ) ;
r a c i n e . addContent ( p l a t ) ;
// a j o u t d ’ une p r o p r i e t e
A t t r i b u t e c l a s s e = new A t t r i b u t e ( ” c l a s s e ” , ” g r a s s e s ” ) ;
plat . setAttribute ( classe ) ;
// A j o u t d ’ un s o u s noeud a p l a t
E l e m e n t accompagnement = new E l e m e n t ( ” accompagnement ” ) ;
accompagnement . s e t T e x t ( ” F r i c a d e l l e s ” ) ;
p l a t . a d d C o n t e n t ( nom ) ;
}
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
Sortie
La classe XMLOutputter propose des méthodes de sortie d’un
document XML
Sous différents formats :
RawFormat : sans modification d’espaces
PrettyFormat : avec mise en page
CompactFormat : sans la normalisation des espaces
Possibilité de ”sortir” : des documents, éléments, commentaires...
5 / 18
E. ADAM (University of Valenciennes)
Sortie XML
Java Avance
25 mars 2008
6 / 18
Parser en XML
Affichage et enregistrement d’un document XML par
JDOM
Ouvrir un document XML
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
void a f f i c h e ()
{
try {
// a f f i c h a g e c l a s s i q u e p a r g e t P r e t t y F o r m a t ( )
XMLOutputter s o r t i e = new XMLOutputter ( Format . g e t P r e t t y F o r m a t ( ) ) ;
s o r t i e . o u t p u t ( document , System . o u t ) ; }
c a t c h ( j a v a . i o . I O E x c e p t i o n e ) {}
}
void e n r e g i s t r e ( String f i c h i e r )
{
try {
// s o r t i e c l a s s i q u e p a r g e t P r e t t y F o r m a t ( )
XMLOutputter s o r t i e = new XMLOutputter ( Format . g e t P r e t t y F o r m a t ( ) ) ;
// E n r e g i s t r e m e n t d a n s f i c h i e r de nom ” f i c h i e r ”
s o r t i e . o u t p u t ( document , new F i l e O u t p u t S t r e a m ( f i c h i e r ) ) ; }
c a t c h ( j a v a . i o . I O E x c e p t i o n e ) {}
}
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
7 / 18
Parser un doc XML
Parser un fichier XML = transformer vers une arborescence JDOM.
Utilisation du constructeur SAXBuilder, basé sur l’API SAX.
v o i d deXMLaJDOM ( )
{
//On c r é e une i n s t a n c e de S A X B u i l d e r
S A X B u i l d e r s x b = new S A X B u i l d e r ( ) ;
try {
// c r e a t i o n d ’ un document JDOM a p a r t i r du f i c h i e r de nom ’
fichier ’
document = s x b . b u i l d ( new F i l e ( f i c h i e r ) ) ; }
c a t c h ( E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” pb de p a r s i n g : ” + e ) ; }
}
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
8 / 18
Parser en XML
Parcourir un document XML
Parcourir un document XML
Parcourir un document XML
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
Balayer l’arbre
Exemple 2
Possibilité de récupérer les fils d’un noeud
Possibilité d’accéder aux attributs d’un noeud
<? xml v e r s i o n=” 1 . 0 ” e n c o d i n g=”UTF−8” ?>
<menu>
< F r i t e s c l a s s e=” g r a s s e s ”>
<accompagnement> F r i c a d e l l e s</ accompagnement>
<s a u c e> B i e r r e</ s a u c e>
</ F r i t e s>
< F r i t e s c l a s s e=” g r a s s e s ”>
<accompagnement>C a r b o n a d e</ accompagnement>
<s a u c e> B i e r r e</ s a u c e>
</ F r i t e s>
< F r i t e s c l a s s e=” s a l e e ”>
<accompagnement>Moule</ accompagnement>
<s a u c e>M a r o i l e</ s a u c e>
</ F r i t e s>
</menu>
E. ADAM (University of Valenciennes)
Java Avance
void afficheMenu ()
{
r a c i n e = document . g e t R o o t E l e m e n t ( ) ;
// r e c u p e r a t i o n d e s p l a t s a b a s e de F r i t e s a p a r t i r de l a r a c i n e
L i s t <Element> l i s t e P l a t s = ( L i s t <Element >) r a c i n e . g e t C h i l d r e n ( ”
Frites ”) ;
// b a l a y a g e p a r I t e r a t o r
I t e r a t o r <Element> i = l i s t e P l a t s . i t e r a t o r ( ) ;
while ( i . hasNext ( ) )
{
Element c ou r a n t = i . next ( ) ;
//On a f f i c h e l ’ accompagnement de l ’ e l e m e n t c o u r a n t
System . o u t . p r i n t l n ( c o u r a n t . g e t C h i l d ( ” accompagnement ” ) . g e t T e x t ( )
);
}
}
25 mars 2008
9 / 18
Filtrage d’un document XML
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
10 / 18
Filtrage d’un document XML
filtrage d’un fichier XML
Exemple de filtre I
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
filtre sur les plats avec sauce à la Bière
void a f f i c h e F i l t r e ()
{
//On c r é e un n o u v e a u f i l t r e
F i l t e r f i l t r e = new F i l t e r ( )
{
p u b l i c b o o l e a n m a t c h e s ( O b j e c t ob )
{
//1− : on ne f i l t r e que l e s E l e m e n t s
i f ( ! ( ob i n s t a n c e o f E l e m e n t ) ) { r e t u r n f a l s e ; }
Filtrage
Utilisation d’un objet de type Filter
Possibilité d’utiliser une sous classes :
ElementFilter basée sur le filtre d’éléments
ContentFilter basée sur le de type de contenu
(commentaires, éléments, ...)
AbstractFilter pour coupler les filtres (par ET, OU,
negation)
E l e m e n t e l e m e n t = ( E l e m e n t ) ob ;
boolean v e r i f S a u c e = f a l s e ;
// 2 − on f i l t r e s u r l a v a l e u r B i e r e de c h a q u e noeud s a u c e
i f ( element . g e t C h i l d ( ” sauce ” ) . getTextTrim ( ) . e q u a l s ( ” B i e r e ” )
) verifSauce = true ;
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
11 / 18
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
12 / 18
Filtrage d’un document XML
Modification d’un document XML
Exemple de filtre II
Modification d’un document XML
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
// S i n o s c o n d i t i o n s s o n t r e m p l i e s on r e t o u r n e t r u e ,
sinon
return verifSauce ;
false
Modifications
}
} ; // F i n du f i l t r e
Possibilité d’utiliser les fonctions suivantes sur les arbres :
// g e t C o n t e n t u t i l i s e l e f i l t r e
L i s t r e s u l t a t = r a c i n e . getContent ( f i l t r e ) ;
addContent,
cloneContent,
removeAttribute, removeChild, removeChildren, removeContent,
removeContent,
setAttribute, setContent, setName, setText,
// A f f i c h a g e de l ’ a t t r i b u t c l a s s e
I t e r a t o r i = r e s u l t a t . i t e r a t o r () ;
while ( i . hasNext ( ) )
{
Element c ou r a n t = ( Element ) i . next ( ) ;
System . o u t . p r i n t l n ( c o u r a n t . g e t A t t r i b u t e V a l u e ( ” c l a s s e ” ) ) ;
}
}
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
13 / 18
Modification d’un document XML
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
14 / 18
Transformation d’un document XML
Exemple de modification
Transformation d’un document XML
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
supression des sauces
void supprElement ( S t r i n g elementASupprimer )
{
r a c i n e = document . g e t R o o t E l e m e n t ( ) ;
// r e c u p e r a t i o n d e s p l a t s
List l i s t P l a t s = racine . getChildren (” Frites ”) ;
I t e r a t o r i = l i s t P l a t s . i t e r a t o r () ;
while ( i . hasNext ( ) )
{
Element c ou r a n t = ( Element ) i . next ( ) ;
// S i on t r o u v e l ’ e l e m e n t a s u p p r i m e r
i f ( c o u r a n t . g e t C h i l d ( e l e m e n t A S u p p r i m e r ) != n u l l )
{
courant . removeChild ( elementASupprimer ) ;
//On renomme l ’ E l e m e n t p e r e
c o u r a n t . setName ( ” p l a t m o d i f i e ” ) ;
}
}
}
E. ADAM (University of Valenciennes)
Java Avance
Transformation
Des règles définies en XSLT permettent de transformer un document
XML
Intérêt :
dialoguer entre applications
transmettre les données sous un autre format
25 mars 2008
15 / 18
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
16 / 18
Transformation d’un document XML
Transformation d’un document XML
Exemple de modification I
Exemple de modification II
inspiré de Nicolas CYNOBER 2005
inspiré de Nicolas CYNOBER 2005
transformation de document
v o i d transformXML ( o r g . jdom . Document documentJDOMEntree , S t r i n g
fichierXSL )
{
// Document JDOMResult , r é s u l t a t de l a t r a n s f o r m a t i o n TraX
JDOMResult documentJDOMSortie = new JDOMResult ( ) ;
// Document JDOM a p r è s t r a n s f o r m a t i o n
o r g . jdom . Document r e s u l t a t = n u l l ;
XMLOutputter o u t p u t t e r = new XMLOutputter ( Format .
getPrettyFormat () ) ;
o u t p u t t e r . o u t p u t ( r e s u l t a t , new F i l e O u t p u t S t r e a m ( ” r e s u l t a t . xml ” )
);
try {
TransformerFactory factory = TransformerFactory . newInstance () ;
T r a n s f o r m e r t r a n s f o r m e r = f a c t o r y . n e w T r a n s f o r m e r ( new
StreamSource ( f i c h i e r X S L ) ) ;
}
catch ( Exception e ) { . . . }
}
t r a n s f o r m e r . t r a n s f o r m ( new o r g . jdom . t r a n s f o r m . JDOMSource (
documentJDOMEntree ) , documentJDOMSortie ) ;
r e s u l t a t = documentJDOMSortie . getDocument ( ) ;
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
17 / 18
E. ADAM (University of Valenciennes)
Java Avance
25 mars 2008
18 / 18