Plan 1 SAX et JDOM Java Avance XML par JDOM Emmanuel ADAM LAMIH UMR CNRS 8530 Université de Valenciennes et du Hainaut-Cambrésis FRANCE 25 mars 2008 2 Création de fichier 3 Sortie XML 4 Parser en XML 5 6 Filtrage d un document XML 7 8 E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 1 / 18 JDOM et XML SAX et JDOM SAX SAX est l acronyme de Simple API for XML. 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 JDOM utilise des collections SAX pour parser les fichiers XML. 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. 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 2 / 18 Création de fichier Création d un fichier XML Création Les noeuds d un arbre XML sont appelés Element Exemple Chaque Element peut posséder des propriétés (Attribute) Chaque Element peut posséder des fils de type Elements <?xml version= 1.0 encoding= UTF 8?> <menu> <accompagnement>f r i c a d e l l e s</accompagnement> </menu> E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 4 / 18
Création de fichier Création d un document XML par JDOM Sortie XML Enregistrement / Affichage d un fichier XML import org. jdom. ;... org. jdom. Document document ;... void creerxml () // Racine = menu Element racine = new Element ( menu ) ; // Creation d un nouveau Document JDOM basé sur la racine document = new Document( racine ) ; // Ajout d un sous noeud Element plat = new Element ( F r i t e s ) ; racine. addcontent ( plat ) ; // ajout d une p r o p r i e t e Attribute c l a s s e = new Attribute ( c l a s s e, grasses ) ; plat. s e t A t t r i b u t e ( c l a s s e ) ; // Ajout d un sous noeud a plat Element accompagnement = new Element ( accompagnement ) ; accompagnement. settext ( F r i c a d e l l e s ) ; plat. addcontent (nom) ; 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... E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 5 / 18 Sortie XML Affichage et enregistrement d un document XML par JDOM 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 par getprettyformat () XMLOutputter s o r t i e = new XMLOutputter ( Format. getprettyformat () ) ; s o r t i e. output ( document, System. out ) ; catch ( java. io. IOException 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 par getprettyformat () XMLOutputter s o r t i e = new XMLOutputter ( Format. getprettyformat () ) ; // Enregistrement dans f i c h i e r de nom f i c h i e r s o r t i e. output ( document, new FileOutputStream ( f i c h i e r ) ) ; catch ( java. io. IOException e ) E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 6 / 18 Parser en XML Ouvrir un document XML Parser un doc XML Parser un fichier XML = transformer vers une arborescence JDOM. Utilisation du constructeur SAXBuilder, basé sur l API SAX. void dexmlajdom() //On crée une instance de SAXBuilder SAXBuilder sxb = new SAXBuilder () ; try // creation d un document JDOM a p a r t i r du f i c h i e r de nom f i c h i e r document = sxb. build (new F i l e ( f i c h i e r ) ) ; catch ( Exception e ) System. e r r. p r i n t l n ( pb de parsing : + e ) ; E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 7 / 18 E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 8 / 18
Parser en XML Exemple 2 <?xml version= 1.0 encoding= UTF 8?> <menu> <accompagnement>f r i c a d e l l e s</accompagnement> <sauce>bierre</ sauce> <accompagnement>carbonade</ accompagnement> <sauce>bierre</ sauce> <F r i t e s c l a s s e= s a l e e > <accompagnement>moule</ accompagnement> <sauce>maroile</ sauce> </menu> E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 9 / 18 Filtrage d un document XML filtrage d un fichier XML Balayer l arbre Possibilité de récupérer les fils d un noeud Possibilité d accéder aux attributs d un noeud void affichemenu () racine = document. getrootelement () ; // recuperation des p l a t s a base de F r i t e s a p a r t i r de la racine List <Element> l i s t e P l a t s = ( List <Element >) racine. getchildren ( F r i t e s ) ; // balayage par 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 () ; Element courant = i. next () ; //On a f f i c h e l accompagnement de l element courant System. out. p r i n t l n ( courant. getchild ( accompagnement ). gettext () ) ; E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 10 / 18 Filtrage d un document XML Exemple de filtre I filtre sur les plats avec sauce à la Bière 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) void a f f i c h e F i l t r e () //On crée un nouveau 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 () public boolean matches ( Object ob ) //1 : on ne f i l t r e que l e s Elements i f (! ( ob instanceof Element ) ) return f a l s e ; Element element = ( Element ) ob ; boolean verifsauce = f a l s e ; //2 on f i l t r e sur la valeur Biere de chaque noeud sauce i f ( element. getchild ( sauce ). gettexttrim (). equals ( Biere ) ) 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 Exemple de filtre II // Si nos conditions sont remplies on retourne true, f a l s e sinon return verifsauce ; ; // Fin du f i l t r e // getcontent 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 = racine. getcontent ( f i l t r e ) ; // Affichage 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 () ; Element courant = ( Element ) i. next () ; System. out. p r i n t l n ( courant. getattributevalue ( c l a s s e ) ) ; Modifications Possibilité d utiliser les fonctions suivantes sur les arbres : addcontent, clonecontent, removeattribute, removechild, removechildren, removecontent, removecontent, setattribute, setcontent, setname, settext, E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 13 / 18 Exemple de modification E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 14 / 18 supression des sauces void supprelement ( String elementasupprimer ) racine = document. getrootelement () ; // recuperation des p l a t s L i s t l i s t P l a t s = racine. getchildren ( F r i t e s ) ; 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 () ; Element courant = ( Element ) i. next () ; // Si on trouve l element a supprimer i f ( courant. getchild ( elementasupprimer )!= n u ll ) courant. removechild ( elementasupprimer ) ; //On renomme l Element pere courant. setname ( p l a t m o d i f i e ) ; 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 E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 15 / 18 E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 16 / 18
Exemple de modification I Exemple de modification II transformation de document void transformxml ( org. jdom. Document documentjdomentree, String fichierxsl ) //Document JDOMResult, r é s u l t a t de la transformation TraX JDOMResult documentjdomsortie = new JDOMResult () ; //Document JDOM après transformation org. jdom. Document r e s u l t a t = n u l l ; try TransformerFactory factory = TransformerFactory. newinstance () ; Transformer transformer = factory. newtransformer (new StreamSource ( fichierxsl ) ) ; transformer. transform (new org. jdom. transform. JDOMSource( documentjdomentree ), documentjdomsortie ) ; r e s u l t a t = documentjdomsortie. getdocument () ; XMLOutputter outputter = new XMLOutputter ( Format. getprettyformat () ) ; outputter. output ( r e s u l t a t, new FileOutputStream ( r e s u l t a t. xml ) ) ; catch ( Exception e )... E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 17 / 18 E. ADAM (University of Valenciennes) Java Avance 25 mars 2008 18 / 18