1/33 Programmation Web Avancée Parsers XML Thierry Hamon Bureau H202 - Institut Galilée Tél. : 33 1.48.38.35.53 Bureau 150 LIM&BIO EA 3969 Université Paris 13 - UFR Léonard de Vinci 74, rue Marcel Cachin, F-93017 Bobigny cedex Tél. : 33 1.48.38.73.07, Fax. : 33 1.48.38.73.55 thierry.hamon@univ-paris13.fr http://http://www-limbio.smbh.univ-paris13.fr/membres/hamon/
2/33 Introduction Objectifs du XML fournir un cadre strict pour Stocker des données Echanger des données Besoin d outils pour l analyse (parsing) des documents XML (SAX, DOM, JAXP, JDOM, etc.) la validité et la conformité des documents XML produits (utilisent l analyse syntaxique du XML) la décomposition des documents en éléments/attributs/... le traitement (manipulation) des documents XML
3/33 Parseurs XML Deux principes d analyse du XML (avec les API correspondantesq) : SAX (Simple API for XML) : Interface évennementielle Manipulation d un document XML au fur et à mesure de la lecture Extraction des informations en fonction de la gestion des évènements liés aux balises rencontrées (création d un élément, etc.) DOM (Document Object Model) : Modèle objet Manipulation d un document XML après l avoir représenté en mémoire sous forme d un arbre d objets
4/33 Parseurs XML Autres API : JAXP (Java API for XML Parsing) - JavaSoft/Sun - http://java.sun.com/xml/jaxp/ Intégrer à Java depuis la version 1.4 Normalisation du parser et XML et uniformisation les paramètres standards (SAX et DOM) API standard pour les transformations de documents XML (processeurs XSLT, XSL-FO et XPATH) JDOM (Java + XML) Définition de classes JAVA pour manipuler des fichiers XML
5/33 Document Object Model (DOM) Représentation Objet en mémoire d un document XML ou HTML (4.0). Norme du consortium W3C (http://www.w3.org/dom/) Modèle générique d objets représentant un document Proposition d une interface de programmation pour les documents HTML ou XML DOM noyau (Core DOM) pour XML DOM HTML Représentation arborescente des objets correspondant au document chargé Manipulation de la structure logique et de l information à l aide de méthodes et d attributs API indépendantes des plates-formes, des langages de programmation et de script
6/33 API DOM (Java) http://www.w3.org/dom API org.xml.dom Classes et méthodes permettant la manipulation d un document via l arbre DOM Manipulation des nœuds (ajout, suppression) et des attributs associés au nœd 3 étapes : 1 Analyse du document XML et représentation sous forme d une arborescence DOM 2 Manipulation et transformation de l arborescence initiale en une nouvelle arborescence DOM 3 Production d un nouveau document XML à partir de la nouvelle arborescence
7/33 Exemple import org. w3c. dom. ; import j a v a x. xml. p a r s e r s. ; import j a v a. i o. ; p u b l i c c l a s s domexample1 { public s t a t i c void main ( String [ ] args ) throws Exception { Document doc ; DocumentBuilderFactory dbf = DocumentBuilderFactory. newinstance ( ) ; dbf. s e t V a l i d a t i n g ( t r u e ) ; // v a l i d a t i o n des documents au c o u r s de l a n a l y s e DocumentBuilder db = dbf. newdocumentbuilder ( ) ; doc = db. p a r s e ( new F i l e ( a r g s [ 0 ] ) ) ; a f f i c h e r (, doc ) ;
8/33 Exemple p u b l i c s t a t i c v o i d a f f i c h e r ( S t r i n g i n d e n t, Node n ) { s w i t c h ( n. getnodetype ( ) ) { case org. w3c. dom. Node.COMMENT NODE: System. out. p r i n t l n ( i n d e n t + <! + n. getnodevalue ( ) + > ) ; break ; case org. w3c. dom. Node. TEXT NODE : System. out. p r i n t l n ( i n d e n t + ( ( C h a r a c t e r D a t a ) n ). getdata ( ) ) ; break ; case org. w3c. dom. Node. ELEMENT NODE : System. out. p r i n t l n ( i n d e n t + < + ( ( Element ) n ). gettagname ( ) + > ) ; break ; N o d e L i s t f i l s = n. g e t C h i l d N o d e s ( ) ; f o r ( i n t i =0; ( i < f i l s. g e t L e n g t h ( ) ) ; i ++) a f f i c h e r ( i n d e n t +, f i l s. item ( i ) ) ; i f ( n. getnodetype ( ) == org. w3c. dom. Node. ELEMENT NODE) System. out. p r i n t l n ( i n d e n t + </ + ( ( Element ) n ). gettagname ( ) + > ) ;
9/33 Interface Node Interface fondamentale : La plupart des objets sont considérés comme des nœuds Utilisation : Manipulation de nœuds (propriétés asssociées, navigation dans l arbre, etc. ) NB: Tout nœud est rattaché à un document mais pas forcément à l arborescence Interfaces : Node, NamedNodeMap, NodeList Interfaces héritant de Node : Attr, CharacterData (Comment, Text / CDATASection, Document, DocumentFragment, DocumentType, Element, Entity, EntityReference, Notation, ProcessingInstruction
10/33 Méthodes de l interface Node Propriétés d un nœud getnodetype() : retourne le type du noeud (ELEMENT NODE, ATTRIBUTE NODE, TEXT NODE,...) getnodename() : retourne le nom de l élément (Null si élément Text, sinon nom de la balise ou de l ttribut getnodevalue() : retourne la valeur du nœud (si Attribut, valeur de l attribut ; si élément, null getattributes() : retourne nodemap des attributs (seulement si élément)
11/33 Méthodes de l interface Node Navigation dans un nœud Possèdent des fils : Boolean haschildnodes() Récupération du premier fils : Node getfirstchild() Récupération du dernier fils : Node getlastchild() Récupération de tous les fils : NodeList getchildnodes() Récupération du père : Node getparentnode();
12/33 Méthodes de l interface Node Manipulation de nœuds Ajouter un nœud en tant que dernier fils : appenchild(node nouvel objet) Ajouter nœud : insertbefore(node nouvel objet,node objet fils) Retirer un nœud : removechild(node objet fils) Remplacer un nœud : replacechild(node nouvel objet,node objet fils) Cloner un nœud : CloneNode(boolean deep) deep == false : copie du nœud courant et des attributs si c est un élément deep == true : copie récursive
13/33 Interface Document Représentation de l ensemble du document comme un nœud Nœud document : racine du document mais pas l élément racine Interface de construction 1 Utilisation des méthodes de document pour créer des nœuds createelement(), createattribut(), createtextnode(),... 2 Association des nœuds au document 3 Ajouter ces nœuds à l arbre Accès au nœud Document : Elément Racine : Node getdocumentelement() Accès aux élément à partir du nom de la balise : NodeList getelemenstbytagname(string name)
14/33 Sauvegarde et transformation d un document? l API DOM (sauf niveau 3) ne fournit pas ces fonctionnalités Il faut utiliser JAXP (Java API for XML Parsing - javax.xml.*) qui utilise : un processeur XSL DOM
15/33 SAX Simple API for XML http://www.saxproject.org API org.xml.sax Normalisation proposée par des industriels (xml-dev) Standard de fait (1997) et supportée par la majeure partie des parsers XML Alternative à DOM pour éviter les problèmes de mémoire et la lecture de gros documents XML
16/33 SAX Simple API for XML Modèle événementiel Analyse à la volée par lecture du flux Implémentation d un ensemble de méthodes correspondant aux évènements du parser : Début/fin du document : startdocument(), enddocument(), characters() débutd/fin d un élément : startelement(), endelement() Adaptée aux documents volumineux Mais pas de conservation de l information
17/33 Interfaces de org.xml.sax : Interfaces de SAX 2 ContentHandler : gestion des évènements liés au contenu DTDHandler : gestion des évènements liés à la DTD ErrorHandler : gestion des erreurs Locator : gestion de la position XMLReader et XMLFilter : analyseur Attributes : gestion de la liste des attributs EntityResolver : gestion des entités externes Classes de org.xml.sax.helpers : org.xml.sax.helpers.defaulthandler implémente org.xml.sax.contenthandler org.xml.sax.dtdhandler org.xml.sax.entityresolver org.xml.sax.errorhandler
18/33 import j a v a x. xml. p a r s e r s. ; import org. xml. s a x. ; import j a v a. i o. F i l e ; Exemple 1 Utilisation de la classe DefaultHandler p u b l i c c l a s s saxexample1 extends org. xml. s a x. h e l p e r s. D e f a u l t H a n d l e r { public s t a t i c void main ( String args [ ] ) throws Exception { SAXParserFactory f a c t o r y = SAXParserFactory. n e w I n s t a n c e ( ) ; SAXParser s a x p a r s e r = f a c t o r y. newsaxparser ( ) ; s a x p a r s e r. p a r s e ( new F i l e ( a r g s [ 0 ] ), new saxexample1 ( ) ) ; p u b l i c v o i d startelement ( String uri, String name, String qname, A t t r i b u t e s a t t r s ) { f o r ( i n t i = 0 ; i < a t t r s. g e t L e n g t h ( ) ; i ++) { S t r i n g namea = a t t r s. getqname ( i ) ; S t r i n g typea = a t t r s. gettype ( i ) ; S t r i n g valuea = a t t r s. g e t V a l u e ( i ) ; System. out. p r i n t l n ( \ t + qname + / + namea + : ( + typea + ) + valuea ) ; p u b l i c v o i d startdocument ( ) { System. out. p r i n t l n ( S t a r t document ) ; p u b l i c v o i d enddocument ( ) { System. out. p r i n t l n ( End document ) ;
19/33 import org. xml. s a x. ; Exemple 2 Utilisation de la classe ContentHandler fichier saxexample3.java public c l a s s saxexample3 implements C o n t e n t H a n d l e r { p u b l i c v o i d setdocumentlocator ( L o c a t o r l o c a t o r ) { p u b l i c v o i d startdocument ( ) throws SAXException { System. out. p r i n t l n ( S t a r t document ) ; p u b l i c v o i d enddocument ( ) throws SAXException { System. out. p r i n t l n ( End document ) ; p u b l i c v o i d startprefixmapping ( String p r e f i x, String u r i ) throws SAXException { p u b l i c v o i d e n d P r e f i x M a p p i n g ( S t r i n g p r e f i x ) throws SAXException {
20/33 Exemple 2 Utilisation de la classe ContentHandler fichier saxexample3.java p u b l i c v o i d startelement ( String uri, String localname, S t r i n g qname, A t t r i b u t e s a t t r s ) throws SAXException { f o r ( i n t i = 0 ; i < a t t r s. g e t L e n g t h ( ) ; i ++) { S t r i n g namea = a t t r s. getqname ( i ) ; S t r i n g typea = a t t r s. gettype ( i ) ; S t r i n g valuea = a t t r s. g e t V a l u e ( i ) ; System. out. p r i n t l n ( \ t + localname + / + namea + : ( + typea + ) + valuea p u b l i c v o i d endelement ( String uri, String localname, S t r i n g qname) throws SAXException { p u b l i c v o i d c h a r a c t e r s ( char ch [ ], i n t s t a r t, i n t l e n g t h ) throws SAXException { public void i g n o r a b l e W h i t e s p a c e ( char ch [ ], i n t s t a r t, i n t l e n g t h ) throws SAXException {
21/33 Exemple 2 Utilisation de la classe ContentHandler fichier saxexample3.java p u b l i c v o i d p r o c e s s i n g I n s t r u c t i o n ( S t r i n g t a r g e t, S t r i n g data ) throws SAXException { p u b l i c v o i d s k i p p e d E n t i t y ( S t r i n g name ) throws SAXException {
22/33 Exemple 2 Utilisation de la classe ContentHandler fichier saxexamplemain.java import org. xml. s a x. ; public c l a s s saxexamplemain { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { t r y { XMLReader p a r s e r = org. xml. s a x. h e l p e r s. XMLReaderFactory. createxmlreader ( ) ; ContentHandler contenthandler = new saxexample3 ( ) ; p a r s e r. s e t C o n t e n t H a n d l e r ( c o n t e n t H a n d l e r ) ; p a r s e r. p a r s e ( a r g s [ 0 ] ) ; catch ( E x c e p t i o n e ) { e. p r i n t S t a c k T r a c e ( ) ;
23/33 Gestion des erreurs Interface ErrorHandler Possibilité de personnalisation des messages d erreur : error(saxparseexception) fatalerror(saxparseexception) warning(saxparseexception) Association au parser : parser.seterrorhandler(errorhandler);
24/33 Gestion des évènements liés à la DTD Interface DTDHandler Notification de déclaration de notation void notationdecl(string name,string PublicId,String systemid) Adaptation du comportement au format du fichier Entité non analysé (Unparsed entity) void unparsedentity(string name,string PublicId,String systemid,string notationname)
25/33 Gestion des entités externes Interface EntityResolver Traitement particulier pour les entités externes Modification de la source à traiter Renvoie d un nouvel InputSource InputSource resolveentity(string publicid, String systemid)
26/33 DOM SAX DOM vs. SAX + Interface permettant la navigation dans tout l arbre + Manipulation de l arbre - Chargement de tout l arbre en mémoire - Représentation de tous les éléments - Traitement du document après l analyse + Traitement du document en cours d analyse + traitement des seuls les éléments pertinents - Ecriture de méthodes de traitements plus compliquées pour lesstructures imbriquées - Pas de conservation de l information
27/33 JAXP Java API for XML Parsing : ensemble d APIs Java permettant d effectuer des traitements XML inclut SAX (2.0) DOM (DOM Level 2) la manipulation de transformations XSLT Objectif : Proposer une couche d abstraction au dessus de SAX et DOM et standardiser les aspects non couvert par SAX et DOM
28/33 DOM : JAXP : Utilité de JAXP Pas de spécification sur la création de objet parser (API différentes, problème de portabilité ) Il faut il faut explicitement importer et référencer la classe de l analyseur (org.apache.xerces.parsers.domparser) Pas de standardisation par le W3C de l analyse du document XML et de la création de l objet associé Pas de norme sur l obtention d un document Couche intermédiaire entre le parser utilisé et l application Propose un parser XML minimal (non validant) supporte les espaces de noms
29/33 API JAXP Utilisation de plusieurs paquetages : javax.xml.parsers Ensemble de classes pour interfacer des parsers SAX : SAXParser et SAXParserFactory DOM : DocumentBuilder et DocumentBuilderFactory org.w3c.dom (DOM) org.xml.sax et org.xml.sax.helpers (SAX)
30/33 Exemple i m p o r t org. w3c. dom. ; i m p o r t j a v a x. xml. p a r s e r s. ; i m p o r t j a v a. i o. ; i m p o r t j a v a x. xml. t r a n s f o r m. stream. StreamSource ; i m p o r t j a v a x. xml. t r a n s f o r m. stream. S t r e a m R e s u l t ; i m p o r t j a v a x. xml. t r a n s f o r m. Source ; i m p o r t j a v a x. xml. t r a n s f o r m. R e s u l t ; i m p o r t j a v a x. xml. t r a n s f o r m. T r a n s f o r m e r ; i m p o r t j a v a x. xml. t r a n s f o r m. T r a n s f o r m e r F a c t o r y ; p u b l i c c l a s s jaxpexample { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { T r a n s f o r m e r T r a n s f o = n u l l ; StreamSource FTransfo=new StreamSource ( new F i l e ( t r a n s f o. x s l ) ) ; TransformerFactory TR=TransformerFactory. newinstance ( ) ; t r y { Transfo=TR. newtransformer ( FTransfo ) ; c a t c h ( E x c e p t i o n t e ) { t e. p r i n t S t a c k T r a c e ( ) ; StreamSource s o u r c e=new StreamSource ( new F i l e ( a r g s [ 0 ] ) ) ; S t r e a m R e s u l t r e s u l t=new S t r e a m R e s u l t ( new F i l e ( r e s u l t. html ) ) ; t r y { T r a n s f o. t r a n s f o r m ( s o u r c e, r e s u l t ) ; c a t c h ( E x c e p t i o n t e ) { t e. p r i n t S t a c k T r a c e ( ) ;
31/33 Description de l API JAXP javax.xml.parsers : Définition de factory retournant des instances de parser pour traiter du XML avec SAX et DOM. javax.xml.transform : Définition de classes et d interfaces pour convertir un document XML en HTML, RTF,... javax.xml.transform.dom : Interfaces (Source et Result) pour DOM javax.xml.trasnform.sax : Interfaces (Source et Result) pour SAX javax.xml.transform.stream : Interfaces (Source et Result) pour représenter l information comme un flot de texte
32/33 Description de l API JAXP sauvegarde et transformation Classe TransformerFactory : création des méthodes de transformation de l arborescence XML newtransformer() : production d un nouveau transformer newtransformer(source XML) : production d un nouveau transformer avec possibilité d utiliser XSL Classe Transformer : application des transformations setparameter : spécification des paramètres à la transformations transform(source XmlSource, Result target) : transformation du document source vers le résultat Classe Source : Utilisation des StreamSource ou DOMSource Classe Result : Utilisation des StreamResult ou DOMResult
33/33 Autres API Autres langages de programmation JDOM : proposer une bibliothèque de classes simple pour la représentation et la manipulation de documents XML (http://www.jdom.org) Faciliter l utilisation de DOM, permettre l enregistrement du résultat d une transformation dom4j : bibliothèque java compatible SAX, DOM et JAXP Perl : XML::DOM, XML::SAX XML::XSLT XMl::Simple : module Perl chargeant en mémoire un document XML (dans le style DOM) sous forme de structure Perl PHP : http://www.php.net/manual/en/refs.xml.php...