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