/ JAXP Module développement/ Conception XML 1
Plan Général parser DOM SAX JAXP 2
Présentation générale Présentation générale DTD XML XML Conception Données Données XSL Amphi précédents XML : syntaxe DTD : spécifier une grammaire XSL : spécifier des traitements Comment faire des applications avec XML? Tirer parti des spécificités de XML Traitement 3
Présentation générale Étapes d une application XML standard Deux étapes essentielles Analyse (parsing) Récupérer les données à partir du fichier XML Traitements des données Manipulation : Accès, Modification, Sauvegarde Autre traitements : affichage, etc Utilisateur Interface Web Analyse traitement Données 4
Présentation générale Composants d une application XML standard Composants d une application XML standard: Sources Données dans un fichier XML Analyse Un parser pour analyser les données du fichier XML Traitement Des objets pour stocker les données Des méthodes pour les manipuler 5
Présentation générale Composants d une application XML standard Composants d une application XML standard: Sources Données dans un fichier XML Analyse Un parser pour analyser les données du fichier XML Traitement Des objets pour stocker les données Des méthodes pour les manipuler Utilisateur Interface Web analyse Application traitement Données Parser Modèle 6
Présentation générale Contenu du cours Utilisateur Interface Web analyse Application traitement Données Parser Modèle Comment Récupérer et Stocker de l information de documents XML Manipuler des documents XML Créer de nouveaux documents XML 7
Plan Général parser DOM SAX JAXP 8
Parser Parser XML (1) Pourquoi un parser? Il existe une infinité de modèle de données XML pour une infinité d'applications Toutes les applications devront implémenter la lecture de données XML : A partir de la même syntaxe (document bien formé) Des grammaires différentes mais représentées dans la DTD Résoudre le problème de l indexation, de stockage, et de manipulation Qu'est-ce qu'un parser? Un parser serait donc un petit module de programme, dont le seul objectif serait de découper un flux d'entrée en un ensemble de " mots" (token) qui seront ensuite proposés à d'autres applications. Un parser n'est donc pas un programme en soi : il est associé à un module de traitement et c'est la nature de ce module qui prime. La spécification XML parle alors de "processeur XML" (parser et traitement). 9
Parser Parser XML (2) Tâches du parser XML : Analyse syntaxique Le contrôle de conformité de la syntaxe par rapport à la norme Tâches du processeur XML : Lire et analyser la structure d'un document XML Décomposition des documents éléments, attributs, texte, entités, instructions de traitement, commentaires, Vérification Documents bien-formés (syntaxiquement corrects) Validation (DTD, schéma) Éventuellement, accéder au contenu de la DTD ou du schéma Pour l'instant, interface propriétaire! Représentation interne des informations : DOM 10
Parser Processeurs XML Interface des parsers est propriétaire Propre au parser utilisé Fonctionnalités fines mais spécifiques et nettement moins portables 2 types Processeurs XML Processeur DOM Modèle objet Document Object Model (DOM 1, 2 et 3) Processeur SAX Interface évènementielle Simple API for XML (SAX 1 et 2) 11
Parser JAXP Autres modèles de parsing et d'api Java API for XML Parsing Une initiative de Sun pour "normaliser" la déclaration du parser XML à utiliser et uniformiser les paramètres standards JDOM Java + XML Définir des classes JAVA pour manipuler des fichiers XML 12
Parser Catégories de parsers XML On peut classifier les parsers sous plusieurs catégories : Les validant vs. non-validant (par rapport DTD) Les parsers supportant le modèle DOM (tree-based) Les parsers supportant l'interface SAX (event-based) Les parsers écrits avec différents langages Java, C/C++, Perl, Python, etc. C# Les parsers: Xerces (apache), JAXP (Sun), Oracle XML Parser, Microsoft XML Parser (msxml), XML4J (IBM), etc Voir les benchmarks! 13
Plan Général parser DOM SAX JAXP 14
DOM DOM Recommandation Utilisation Package DOM Parser DOM Lecture de document Manipulation Interface Node Interface Document Sauvegarde 15
La recommandation DOM du W3C Document Object Model C est une recommandation du W3C ("norme") Elle spécifie une API orientée objet permettant au programmeur d application d écrire des fonctions de création, de modification et de consultation des éléments constitutifs d un document XML ou HTML. C est un modèle d objets représentant un document : générique une interface de programmation pour les documents HTML ou XML DOM core, DOM HTML Représentation arborescente d objets : Attributs et méthodes permettent la manipulation de la structure logique et l information contenue dans ce document Indépendant des plates-formes, des langages de programmation et de script 16
Qu est ce que DOM? Représentation en mémoire d'un arbre de nœuds contenant la structure et les données contenues dans le document XML Lecture d'un document XML existant XML Modèle Création d un modèle Utilisant un parser Modèle Parser Données 17
Qu est ce que DOM? Représentation en mémoire d'un arbre de nœuds contenant la structure et les données contenues dans le document XML Lecture d'un document XML existant XML Modèle Création d un modèle Utilisant un parser Modifications en utilisant l'api DOM Modèle Modèle Manipulation de modèle Modèle Parser Modèle Parser Données Données 18
Qu est ce que DOM? Représentation en mémoire d'un arbre de nœuds contenant la structure et les données contenues dans le document XML Lecture d'un document XML existant XML Modèle Création d un modèle Utilisant un parser Modifications en utilisant l'api DOM Modèle Modèle Manipulation de modèle Création d'un nouveau document XML Modèle XML Sauvegarde de document XML Modèle Parser Modèle Parser Modèle Parser Données Données Données 19
Intérêts de DOM DOM se situe entre le parser et l'application Indépendance (ou presque) de l'application par rapport au parser Modèle générique de document API indépendante des plate-formes et langages 20
DOM : organisation des recommandations La spécification est organisée en différents niveaux (3 niveaux) Chaque niveau possède un CORE Qui est générique, pour n'importe quel document XML Qui a certaines caractéristiques dépendantes du niveau Que doit supporter toute implémentation de DOM. Des modules Correspond à des interfaces spécifiques, pour des types de documents donnés. Ces interfaces sont des extensions des interfaces Core DOM XML : avec specificité entité, CDATA DOM HTML DOM CSS 21
DOM : core et extensions Le CORE de DOM définit les éléments ci-après : ce qu'est une implémentation DOM et la nature des erreurs reconnues les interfaces de gestion d'un document XML pour Y accéder (fonction d'accès à des éléments, attributs, etc.) le construire (fonctions de création de documents, d'éléments, d'attributs, etc.) Les extensions, qui sont optionnelles dans les implémentations, ajoutent pour XML: les notions de sections CDATA et la gestion des entités externes (niveau 1), les notions de DTD, de processing instructions, de notation (niveau 2). 22
DOM Niveau 1 (Oct 1998) Objectif : gestion XML et HTML Définit un modèle orienté objet pour représenter des documents structurés (XML, HTML) Document, Element, Attr, Text,, Node CORE: Accéder et construire document Extension XML et HTML Objets nouveaux comme les frames, les images ou les ancres. Les fonctionnalités de manipulation sont minimes, celles du core étant a priori souvent suffisantes. 23
DOM Niveau 2 (Nov 2000) CORE : Ajout des espaces de nommage (ajouter NS à la fin des méthodes (éléments par ex)) Extensions : Des fonctionnalités de manipulation des CSS, les feuilles de styles associées aux documents HTML. Des fonctionnalités d'accès à des événements liées à des changements d'état d'un document ou à des actions de l'utilisateur sur un document (Des fonctionnalités de parcours de document XML, avec ou sans filtre Fonctionnalités d'identification de portion de document, basées sur les informations de structure ou sur des contenus quelconques, identifiés par leur ordre séquentiel. 24
DOM Niveau 3 (Avr 2004) DOM CORE niveau 3 permet Accés aux modèles de documents Sous la forme de DTD, Schéma ou tout autre formalisme. Chargement et sauvegarde des données Utilisation de filtres 25
Utilisation de DOM Vous devez disposer parserxml Compatible DOM JAXP ou Xerces Fichier XML Implémentation DOM Java Possibilité Création Manipulation Sauvegarde? Instancier document Source Manipulation document Sauvegarde document Destination 26
import org.w3c.dom.*; Package et API DOM et indépendant du parser sauf : Pour instancier un Document Mais à partir d'une instance de Document, on reste dans du DOM Pour accéder aux nœuds, éléments, attributs, textes, Pour créer de nouveaux nœuds 27
Instancier un document DOM Instancier document Manipulation document Sauvegarde document Source Destination 28
Lecture de DOM Utilise un parser compatible DOM Document XML Parser XML Transforme le document XML en objets Java. Accès et modification par l'api DOM Objets Ensemble d'objets contenant l'information du document XML, un objet Document. Application Utilisation de l'interface DOM pour accéder aux données du document XML Parser XML & DOM 29
Un parser XML DOM Transforme un document XML en une représentation arborescente orientée objet Le document est stocké en mémoire (attention donc!) Permet d'accéder, de naviguer ou de modifier le document Sans manipuler directement le fichier XML! Le parser effectue quelques traitements simples Résout toutes les entités externes par exemple Opération de validation si la DTD/schéma est présent 30
Étapes On dispose d un document XML Trois étapes Spécifier un parser DOM Créer un objet document Charger le contenu du fichier XML dans le document Ces étapes dépendent du parser utilisé 31
Créer un document (exemple JAXP) import org.w3c.dom.*; //package DOM import javax.xml.parsers.*; //jaxp import java.io.*; try { // Code propre à JAXP de Sun DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newdocumentbuilder (); Document doc = db.parse(new File("annuaire.xml")); Création documentbuilder Création du document // A partir d'ici, c'est du DOM } cash(exception e) { } 32
Créer un document (exemple Xerces) import org.w3c.dom.*; //package DOM import java.io.*; try { // Code propre à Xerces org.apache.xerces.parsers.domparser parser= new org.apache.xerces.parsers.domparser (); parser.setfeature("http://xml.org/sax/features/validation",true); Création parser parser.parse("annuaire.xml"); Document doc=parser.getdocument(); Création du document // A partir d'ici, c'est du DOM } cash(exception e) { } 33
Manipulation On suppose qu on a un document chargé Indépendant du parser Instancier document Manipulation document Sauvegarde document Source Destination Utiliser API DOM Créer un objet Document API DOM différentes interfaces 34
DOMImplementation NodeList DOM-core (interfaces API DOM) DocumentFragment Element Node Attr CharacterData Document Text Comment CDATASection DocumentType Notation Entity ProcessingInstruction 35
DOM-core : interface Node Interface fondamentale Node : tout est nœud ou presque Utilisation: On ne manipule que des nœuds On ne crée pas de nœuds Mais une interface héritée Éléments, Attributs, Commentaires, etc Remarque: Tout nœud est rattaché à un document (propriété ownerdocument) Mais n est pas forcément dans l arbre du document (ex création) 36
DOM-core : Node (propriétés) Méthodes de l'interface Node getnodetype( ): indique une valeur caractérisant le type du noeud (ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, ) getnodename( ): nom de l élément (lecture seule) Null si Text Nom de la balise ou de l attribut getnodevalue( ) : valeur du nœud Attribut: valeur de l attribut Si élément retourne null getattributes( ) : Retourne nodemap des attributs (seulement si élément) 37
Types de nœud Type nodename nodevalue attributes Element tag name null NamedNodeMap Attr attribute name valeur de l'attribut null Text #text contenu null CDATASection #cdata-section contenu null EntityReference nom de l'entité null null Entity nom de l'entité null null ProcessingInstruction cible (target) contenu sauf la cible null Comment #comment contenu du commentaire null Document #document null null DocumentType nom de la DTD null null DocumentFragment #document-fragment null null Notation nom de la notation null null 38
Exemple <?xml version="1.0"?> <carnet> <personne> <nom>thomas</nom> <prenom>vincent</prenom> </personne> </carnet> Element Carnet Element Personne Element Nom Text Thomas Element Prenom 39 Text Vincent
Exemple Element Carnet Element Personne Element Nom Element Prenom Text Thomas Text Vincent nodetype? nodename? nodevalue? 40
Exemple Element Carnet Element Personne Element Nom Element Prenom Text Thomas Text Vincent nodetype ELEMENT_NODE nodename Nom nodevalue null 41
Exemple Element Carnet Element Personne Element Nom Element Prenom Text Thomas Text Vincent nodetype? nodename? nodevalue? 42
Exemple Element Carnet Element Personne Element Nom Element Prenom Text Thomas Text Vincent nodetype TEXT_NODE nodename "#text" nodevalue "Thomas" 43
Node (navigation dans l arbre) Savoir si le nœud à des enfants Boolean haschildnodes() Accéder aux autres éléments Faire des gets (cf transparent suivant) 44
DOM-core (navigation dans l arbre) Node ParentNode Node PreviousSibling Node Élément courant NodeList ChildNodes Node FirstChild Node Node NextSibling Node LastChild 45
Navigation arbre avec Node (exemple) <?xml version="1.0"?> <carnet> <personne> <nom>thomas</nom> <prenom>vincent</prenom> </personne> </carnet> // part d un Node Obj correspondant à Carnet Element Carnet Element Personne Element Nom //acceder «carnet» Obj.getNodeName(); //acceder «prenom» Node Obj2=(Obj.getLastChild()).getLastChild(); Obj2.getNodeName(); //acceder «Vincent» (Obj2.getLastChild()).getNodeValue(); Element Prenom Text Thomas Text Vincent 46
DOM-core : Node (manipulation) 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) 47
Interface Node: Clone Node Deux manières distinctes de cloner Superficielle Seul nœud courant Et les attributs (si c'est un élément) En profondeur récursivement "false" (superficiel) clonenode() "true" (en profondeur) 48
DOM-core : interface document L interface document représente l ensemble du document C est aussi un Node Le nœud document est la racine du document Et non pas l élément racine!! Interface de construction Utiliser des méthodes de document pour créer des nœuds Les nœuds sont reliés au document (même s ils ne sont pas dans l arbre) Ajouter ces nœuds à l arbre 49
Méthodes de construction createnodetype() Précise NodeType Element, Attribut, TextNode, DOM-core : document Méthodes d accès Node getdocumentelement() : renvoie l élément racine NodeList getelemenstbytagname(string name) Accès aux élément à partir des tags 50
Navigation arbre avec document <?xml version="1.0"?> <carnet> <personne> <nom>thomas</nom> <prenom>vincent</prenom> </personne> </carnet> Element Carnet Element Personne Element Nom // part d un Document Doc //acceder «carnet» Node Obj=Doc.getDocumentElement(); Obj.getNodeName(); Element Prenom Text Thomas Text Vincent 51
DOM-Core (document from scratch) Démarche à suivre: 1. Créer un document ObjDoc = new Document(); 2. Créer des éléments à partir du document ObjElement=ObjDoc.createElement("racine"); SsElement=ObjDoc.createElement("elem"); 3. Insérer les éléments dans l arbre ObjDoc.appenChild(ObjElement); ObjElement.appenChild(SsElement); 52
DOM-Core (document from scratch) Attention Les nœuds créés appartiennent au document Les nœuds créés appartiennent au document Insérer un Nœud de Doc1 sur l arbre de Doc2 Génére DOMException utiliser Node importnode(node noeud, boolean deep) de document // part d un Document Doc1 et Doc2 Element El1=doc1.getDocumentElement(); Element El2=doc2.getDocumentElement(); //génère une exception El1.appenChild(El2); // part d un Document Doc1 et Doc2 Element El1=doc1.getDocumentElement(); Element El2=doc2.getDocumentElement(); //accepté Node node=doc1.importnode(el2, true) El1.appenChild(El2); 53
DOM-core : Element (manipulation) NamedNodeMap getattributes() String getattribute (String name) Retourne la valeur de l attribut Attr getattribute (String name) Retourne le noeud de l attribut String gettagname() Retourne le nom de l élément void removeattribute(string name) Retire l attribut spécifié Idem avec removeattributenode(attr node) void setattribute(string name, String value) Ajoute un attribut Idem avec setattributenode(attr node) 54
DOM-core : Attributs (manipulation) Les attributs sont des Node eux aussi MAIS Ils ne sont pas connectés à l arbre par dépendance hiérarchique Pour un node élément, getchildnodes( ) ne contient pas d attributs, il faut utiliser getattributes( ) de node 55
DOM-core : DocumentFragment Un fragment de document XML peut être stocké temporairement dans un nœud de type DocumentFragment Objet léger, par exemple pour les copier-coller Attaché sur un autre nœud, il se détruit automatiquement Très utile pour l ajout des enfants dans l arbre Arbre DOM Sous arbre DocumentFragment Nouvel Arbre DOM 56
On a un document Sauvegarde d un Document Instancier document Manipulation document Sauvegarde document Source Destination On souhaite l exporter Directement Après transformation XSLT 57
Sauvegarde et transformation d un document Pas dans API DOM (sauf niveau 3) Dans JAXP: Java API for XML Parsing Processeurs XSL Utilise DOM (fin amphi : JAXP) Packages javax.xml.transform 58
DOM: sauvegarde et transformation (JAXP) Class TransformerFactory : créer des Transformer...(sic) newtransformer() qui produit un nouveau transformer newtransformer(source XML) qui produit un nouveau transformer (possibilité d utiliser XSL) Class Transformer : appliquer des transformations setparameter permet de spécifier des paramètres à la transformations transform(source XmlSource, Result target) effectue la transformation du document source vers le résultat Class Source : Utiliser des StreamSource ou DOMSource Class Result : Utiliser des StreamResult ou DOMResult 59
DOM: sauvegarde et transformation (ex) // créer un stream vers xsl StreamSource style_auteur=new StreamSource("transfo.xsl"); 60
DOM: sauvegarde et transformation (ex) // créer un stream vers xsl StreamSource style_auteur=new StreamSource("transfo.xsl"); //créer un transformer utilisant XSL TransformerFactory TR=TransformerFactory.newInstance(); Transformer Transfo=TR.newTransformer(style_auteur); 61
DOM: sauvegarde et transformation (ex) // créer un stream vers xsl StreamSource style_auteur=new StreamSource("transfo.xsl"); //créer un transformer utilisant XSL TransformerFactory TR=TransformerFactory.newInstance(); Transformer Transfo=TR.newTransformer(style_auteur); //créer la source et la destination //doc désigne un document DOM DOMSource source=new DOMSource(doc); StreamResult=new StreamResult("result.html"); 62
DOM: sauvegarde et transformation (ex) // créer un stream vers xsl StreamSource style_auteur=new StreamSource("transfo.xsl"); //créer un transformer utilisant XSL TransformerFactory TR=TransformerFactory.newInstance(); Transformer Transfo=TR.newTransformer(style_auteur); //créer la source et la destination //doc désigne un document DOM DOMSource source=new DOMSource(doc); StreamResult=new StreamResult("result.html"); //appliquer la transformation Transfo.transform(sourceb,resultb); 63
On a vu DOM: résumé L API DOM Interface node, document, Comment utiliser cette API sous java Package Pour Charger et analyser un document XML Manipuler ce document Faire des transformations Sauvegarder le document Plus d informations sur: http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/package-summary.html 64
SAX Plan Général parser DOM SAX JAXP 65
SAX Simple API for XML Interface SAX (1) SAX est une normalisation proposée par des industriels (xml-dev) Standard de fait (1997) Supportée par la majeure partie des parsers XML Une alternative à DOM pour éviter les problèmes de mémoire et la lecture de gros documents XML 66
SAX DOM Différence SAX/DOM Utilisateur Application analyse traitement Données Parser Modèle Problème: on charge tout le document en mémoire Avantage: on peut manipuler l'arbre construit SAX Demande analyse Application Gestionnaire événement Données Parser SAX Avantage : On traite au fur et à mesure Probleme: On ne conserve pas l'information 67
SAX Interface SAX (2) Principe: SAX est événementiel Une application SAX implémente un ensemble de méthodes correspondant aux évènements du parser Balise ouvrante/fermante... Le parser XML appelle ces méthodes, en passant les paramètres nécessaires un nom pour un élément, un couple nom/valeur pour un attribut, Un parser SAX est uniquement un consommateur de données, il ne garde rien en mémoire 68
SAX Architecture générique d'une application SAX Application SAX 2 Modèle objet Java 3 Parser SAX XML -> Java String toxml() Java -> XML 1 4 Document XML Document XML 69
SAX Application SAX Avoir un parser XML implémentant SAX Trois étapes pour utiliser SAX Créer un modèle objet interne (comme CD, Livre, ) Créer un parser SAX Créer un ContentHandler Qui traite les événements pour transformer le document XML en objets internes Et éventuellement, un ErrorHandler, DTDHandler et un EntityResolver Créer modèle Objet interne Créer un Parser SAX Créer un ContentHandler 70
SAX 1) Créer un modèle objet interne Créer modèle Objet interne Créer un ContentHandler Créer un Parser SAX Votre objet Dans lequel vous récupérerez les informations lors de l analyse 71
SAX 2) Créer un ContentHandler Créer modèle Objet interne Créer un ContentHandler Créer un Parser SAX ContentHandler est chargé de traiter les événements Package org.xml.sax.* En JAVA: il suffit implémenter interface ContentHandler Et surcharger certaines méthodes pour répondre aux événements correspondants 72
SAX ContentHandler (Réception évènements) Évènement Méthode Début du document Fin du document startdocument() enddocument() Balise ouvrante Balise fermante startelement(string, String local, String qname, Attributes liste) endelement(string) Chaîne de caractères Processing instruction Espaces blancs (problème DTD) characters(char[],int, int) processinginstruction(string,string) ignorablewhitespace(char[],int,int) 73
SAX Séquence des évènements <?xml version="1.0"?> <cd id="4"> <titre> Freak on ica </titre> startdocument() startelement("cd",...) startelement("titre",...) characters(char[],start,length) endelement("titre") </cd> endelement("cd") enddocument() 74
SAX Remarques Attention Pas de recommandation SAX pour characters Pour les contenus mixtes <cd id="4"> a <b/> c </cd> Récupérer les attributs startelement(string namespaceuri, String localname, String qname, Attributes atts) a pour paramètres Le nom qname de l élément rencontré La liste d attributs liste avec plusieurs methodes getlength() qui renvoie le nombre d attributs getqname(int i) renvoie le nom de l attribut numero i getvalue(int i) renvoie la valeur de l attribut numero i getvalue(string name) renvoie la valeur de l attribut name gettype(int i) revoie le type de l attribut 75
SAX DefaultHandler qui affiche les éléments Utiliser une classe DefaultHandler implémentant ContentHandler Pour afficher les noms des éléments rencontrés Public class Lecture extends DefaultHandler { public void startdocument() throws SAXException {System.out.println("debut");} public void enddocument() throws SAXException {System.out.println("fin");} public void startelement(string namespaceuri, String localname, String qname, Attributes atts) throws SAXException { System.out.println("l element est"+qname);} Début document Fin document Début élément } 76
SAX Utilisation du handler <?xml version="1.0"?> <cd id="4"> <titre> Freak on ica </titre> startdocument() startelement( ) startelement( ) characters( ) endelement( ) début cd rencontré titre rencontré </cd> endelement( ) enddocument() fin 77
SAX 3) Créer un parser SAX Créer modèle Objet interne Créer un ContentHandler Créer un Parser SAX Il faut créer un parser SAX A partir d une librairie En lui fournissant le ContentHandler Possibilité De gérer les exceptions : interface errorhandler D accéder aux déclarations de la dtd: interface DTDHandler De gérer plusieurs entrées De résoudre les liens des entités 78
SAX Création du parser SAX Déclarer un parser Obtenir un parser org.xml.sax.xmlreader reader; reader = org.xml.sax.helpers.xmlreaderfactory.createxmlreader(nom); Désigne un parser compatible SAX Par exemple : "com.sun.xml.parser.parser" Associer un ContentHandler reader.setcontenthandler(handler); Handler désigne un ContentHandler Instancié au préalable 79
SAX Lier le parser a un fichier XML InputSource : Analogue à un InputStream mais encapsule un flux de lecture sur : un flux d'octets (bytes) un flux de caractères une connexion HTTP un fichier XML local Création InputSource InputSource InputSource source= new source= InputSource(source) new InputSource("nom") Le lier au XMLReader pour parser un fichier Xmlreader.parse(source); 80
SAX Interface ErrorHandler Gestion des exceptions Ses Méthodes permettent de personnaliser les messages d erreur dans votre Application SAX error(saxparseexception) : fatalerror(saxparseexception) warning(saxparseexception) Associer au parser parser.seterrorhandler(errorhandler); 81
SAX DTDHandler Interface pour des évènements liés à la DTD Notation dans les DTD Notation déclaré dans les DTD Permet de spécifier des formats de fichiers Evenement récupéré par la méthode Void notationdecl(string name,string PublicId,String systemid) Unparsed entity Evenement récupéré par la méthode Void unparsedentity(string name,string PublicId,String systemid,string notationname) 82
SAX EntityResolver Permet de modifier la source à traiter Lorsqu'on rencontre des entités exterieure Évènement est récupéré par la méthode resolveentity Celle-ci retourne un nouvel InputSource 83
ou SAX? DOM Navigation, parcours du document Documents peu structurés Beaucoup de données Petits documents (< 1Mo) Extraction de fragment Création de nouveau document XML SAX Lecture séquentielle : pas d'accès aléatoire au document Documents très structurés Peu de données Petits et gros documents (de 1ko à 2,5Mo) Sélection Extraction de données Filtrage 84
JAXP et JDOM Plan Général parser DOM SAX JAXP et JDOM 85
JAXP et JDOM JAXP Java API for XML Parsing JAXP est un ensemble d'apis Java permettant d'effectuer des traitements XML qui inclut SAX (SAX 2.0) DOM (DOM Level 2) la manipulation de transformations XSLT Le but est de : Fournir une couche d abstraction au dessus de SAX ou DOM afin de garantir un effort de standardisation des aspects non couverts par SAX et DOM L origine : L'API est le fruit de travaux de développement communs à Ariba, AOL/Netscape, BEA, Bluestone, Fujitsu, IBM, et Oracle. Téléchargeable gratuitement depuis l'espace de Sun Java Technology and XML (XML Pack). 86
JAXP et JDOM Packages JAXP La librairie JAXP utilise plusieurs packages javax.xml.parsers Ensemble de classes pour interfacer des parsers SAX : SAXParser et SAXParserFactory DOM : DocumentBuilder et DocumentBuilderFactory org.w3c.dom Package DOM org.xml.sax et org.xml.sax.helpers Packages SAX 87
JAXP et JDOM JAXP Pourquoi utiliser JAXP : DOM ne spécifie pas comment créer un objet parser différent API selon implémentation portabilité du code est affecté. En utilisant DOM, il faut explicitement importer et référencer la classe de l analyseur (org.apache.xerces.parsers.domparser) Si on change de parser problèmes! Avant chaque opération DOM, le document XML a besoin d être analysé (parsé) et un objet doit être créé. Cette opération n est pas standardisée par le W3C! Pas de norme sur l'obtention d'un document JAXP sert donc de couche intermédiaire entre votre application et le(s) parser(s) utilisé(s). Livré en plus avec un parser XML minimal (non validant) 88
JAXP et JDOM Cf transparent DOM Cf transparents SAX JAXP comment utiliser? 89
JAXP et JDOM DOM: Créer un document (exemple JAXP) import org.w3c.dom.*; //package DOM import javax.xml.parsers.*; //jaxp import java.io.*; try { // Code propre à JAXP de Sun DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newdocumentbuilder (); Document doc = db.parse(new File("annuaire.xml")); Création documentbuilder Création du document // A partir d'ici, c'est du DOM } cash(exception e) { } 90
JAXP et JDOM DOM: sauvegarde et transformation (ex) // créer un stream vers xsl StreamSource style_auteur=new StreamSource("transfo.xsl"); //créer un transformer utilisant XSL TransformerFactory TR=TransformerFactory.newInstance(); Transformer Transfo=TR.newTransformer(style_auteur); //créer la source et la destination //doc désigne un document DOM DOMSource source=new DOMSource(doc); StreamResult=new StreamResult("result.html"); //appliquer la transformation Transfo.transform(sourceb,resultb); 91
JAXP et JDOM JDOM : le principe Philosophie de JDOM (projet open-source Apache like): Facile à utiliser pour les programmeurs Java Devrait intégrer DOM et SAX Lecture et écriture des documents DOM et les évènements SAX Utilisation des différents parsers DOM ou SAX (utilisation du modèle JAXP) Devrait rester compatible avec les dernières normes de XML Pourquoi ne pas utiliser DOM directement : Occupation élevée de la mémoire Pourquoi ne pas utiliser SAX : Pas de possibilité de modifier les documents, d accéder aléatoirement, ou de générer une sortie physique Java optimalisé (utilisation des Collections Java 2 par exemple) Couvrir 80% des problèmes et laisser 20% aux autres parsers! 92
JAXP et JDOM Les classes représentant un document XML et sa construction: Attribute CDATA Comment DocType Document Element EntityRef Namespace ProcessingInstruction (PartialList) (Verifier) (Assorted Exceptions) JDOM : packages Les classes de lecture des documents XML depuis des sources existants : DOMBuilder SAXBuilder Packages d adaptateurs pour obtenir un objet DOM à partir de n importe quel analyseur org.jdom org.jdom.adapters org.jdom.input Les classes pour écrire les documents XML sous plusieurs formes et sorties : org.jdom.output DOMOutputter SAXOutputter XMLOutputter org.jdom.transform 93
JAXP et JDOM JDOM vs. DOM : un exemple Création d'un document from scratch en JDOM Document doc = new Document( new Element("rootElement").setText("This is a root element")); Et en DOM? Document mydocument = new org.apache.xerces.dom.documentimpl(); Element root = mydocument.createelement("myrootelement"); Text text = mydocument.createtext( "This is a root element"); // Et on ajoute le tout! root.appendchild(text); mydocument.appendchild(root); 94