Vous êtes sur la page 1sur 46

FAQ Java XML

Date de publication : 12/10/2006 Dernire mise jour : 17/05/2009

Cette faq a t ralise partir des questions frquemment poses sur les forums de http://www.developpez.com et de l'exprience personnelle des auteurs. Nous tenons souligner que cette faq ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette faq ne prtend pas non plus tre complte. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rdacteur, lisez Comment participer cette faq ?. Sur ce, nous vous souhaitons une bonne lecture. L'quipe Java

Ont contribu cette FAQ :

bazinou - iubito - Clment Cunin - Johann Heymes - Ronan Le Gallo - Christophe Ludet - Jean-Baptiste Bugeaud Grgory Danelon - Sbastien Meric - Romain Guy - PierreYves Varoux - Ioan Calapodescu - bahamouth - duj - braim - bulbo - Ricky81 - L'quipe Java - Debernad - jcarre - Seigne David - cyberzoide - xavlours - christopheJ willowII - Nourdine Falola - laffreuxthomas - adiGuba -

FAQ Java XML

1. 2. 3. 4. 5. 6.

Informations gnrales (5) .........................................................................................................................................................4 Gnralits (11) ......................................................................................................................................................................... 7 SAX (6) ....................................................................................................................................................................................13 DOM (11) ................................................................................................................................................................................ 20 XSLT (9) ..................................................................................................................................................................................29 XPath (12) ................................................................................................................................................................................37

-3Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Sommaire > Informations gnrales Comment bien utiliser cette faq ?


Auteurs : L'quipe Java , Le but : Cette faq a t conue pour tre la plus simple possible d'utilisation. Elle tente d'apporter des rponses simples et compltes aux questions auxquelles sont confronts tous les dbutants (et les autres). L'organisation : Les questions sont organises par thme, les thmes pouvant eux-mme contenir des sous-thmes. Lorsqu'une question porte sur plusieurs thmes, celle-ci est insre dans chacun des thmes rendant la recherche plus facile. Les rponses : Les rponses contiennent des explications et des codes sources. Certaines sont compltes de fichier tlcharger contenant un programme de dmonstration. Ces programmes sont volontairement trs simples afin qu'il soit ais de localiser le code intressant. Les rponses peuvent galement tre compltes de liens vers d'autres rponses, vers la documentation en ligne de Sun ou vers un autre site en rapport. Nouveauts et mises jour : Lors de l'ajout ou de la modification d'une question/rponse, un indicateur est plac cot du titre de la question. Cet indicateur reste visible pour une dure de 15 jours afin de vous permettre de voir rapidement les modifications apportes. J'espre que cette faq pourra rpondre vos questions. N'hsitez pas nous faire part de tous commentaires/remarques/ critiques. lien : Comment participer cette faq ?

Comment participer cette faq ?


Auteurs : L'quipe Java , Cette faq est ouverte toute collaboration. Pour viter la multiplication des versions, il serait prfrable que toutes collaborations soient transmises aux administrateurs de la faq. Plusieurs comptences sont actuellement recherches pour amliorer cette faq : Rdacteur : Bien videmment, toute nouvelle question/rponse est la bienvenue. Web designer : Toute personne capable de faire une meilleure mise en page, une feuille de style ou de belles images... Correcteur :

-4Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Malgr nos efforts, des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contacter les administrateurs si vous en dbusquez une... Idem pour les liens errons. lien : Quels sont les droits de reproduction de cette FAQ ?

Quels sont les droits de reproduction de cette FAQ ?


Auteurs : L'quipe Java , Les codes sources prsents sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : - Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http://www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2004 Developpez LLC : Tous droits rservs Developpez LLC. Aucune reproduction ne peut en tre faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts. Cette page est dpose la SACD.

O trouver d'autres sources d'information ?


Auteurs : L'quipe Java , Les cours et didacticiels de www.developpez.com Les forums de la section Java de www.developpez.com La FAQ Struts La Javadoc : toutes les informations utiles sur les classes, leurs mthodes ... toujours avoir sous la main. Les didacticiels de Sun La FAQ de JGuru, beaucoup plus complte que celle-ci ...

Remerciements
Auteurs : L'quipe Java , Un grand merci tous ceux qui ont pris de leur temps pour la ralisation de cette FAQ. Aux rdacteurs : Remerciements tout d'abord tous ceux qui ont rdig les questions et les rponses. Clment Cunin, Johann Heymes, Nicolas Cuny, Ronan Le Gallo, Christophe Ludet, Jean-Baptiste Bugeaud, Sebastien Andreo, Grgory Danelon, Sbastien Meric, Romain Guy, Pierre-Yves Varoux, Ioan, bahamouth, duj, Braim, bulbo, Ricky81, Debernad, jcarre, David Seigne, xavlours, christopheJ, willowII, Nourdine Falola, laffreuxthomas. Aux correcteurs :

-5Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Remerciements galement aux personnes qui ont relu les textes pour supprimer un maximum de fautes de franais. Nicolas Cuny, Jonathan Muller, Etienne Bar, Bestiol, Ukyuu. Aux visiteurs : Remerciements enfin tous ceux qui ont consult cette FAQ, et qui, par leurs remarques, nous ont aid la perfectionner. Et pour finir, un merci tout spcial Clment Cunin, qui est l'origine de cette FAQ, cyberzoide pour notre logo et ses conseils aviss et tous les membres de l'quipe qui nous ont fourni outils et logiciels ncessaires pour la ralisation de ce document.

-6Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Sommaire > Gnralits Comment manipuler du XML avec Java ?


Auteurs : Ioan Calapodescu , Tout d'abord, rappellons ce qu'est XML. XML (pour eXtensible Markup Language) est un langage de balisage (comme le HTML, par exemple), utilis pour la reprsentation et structuration de donnes. Voici quelques caractristiques de ce standard : Extensible : au contraire du HTML, qui contient un jeu limit de balises, le XML permet la cration de ses propres balises. Mta-langage : grce son exstensibilit, le XML est un standard tout fait appropri pour la cration d'autres langages (XHTML, par exemple). Portable : le XML n'est rien d'autre que du texte entre des balises.

Les questions de cette partie de la FAQ portent uniquement sur la manipulation de XML avec la technologie Java. Pour des informations plus spcifiques sur le standard XML, en lui mme, regardez : Ou trouver plus d'informations sur le format XML ? L'API Java standard pour la manipulation du format XML est JAXP (Java API for XML Processing). Cette API permet la lecture, la transformation et l'criture de fichiers ou flux XML. C'est cette API que nous allons tudier dans la partie XML de cette FAQ. JAXP n'est pas la seule API disponible pour travailler avec XML. Pour plus d'informations sur les autres API disponibles regardez : Quelles autres API existent pour travailler avec XML ?. lien : Qu'est-ce que JAXP ? lien : Ou trouver plus d'informations sur le format XML ? lien : Quelles autres API existent pour travailler avec XML ?

Qu'est-ce que JAXP ?


Auteurs : Ioan Calapodescu , JAXP (Java API for XML Processing) est compose de quatre packages. Cette API met la disposition du dveloppeur trois ensembles de fonctionnalits (la modlisation, le parsing et la transformation) regroupes en quatre packages distincts. javax.xml.parsers : Ce package contient un ensemble d'interfaces devant tre implmentes par les diffrents parseurs (SAX ou DOM). Ce package fournit aussi un ensemble de factory permettant l'accs aux parseurs. org.w3c.dom : Ce package contient l'ensemble des classes et interfaces ncessaires pour travailler avec DOM (modlisation). org.xml.sax : Ce package contient l'ensemble des classes et interfaces ncessaires pour travailler avec SAX (parsing). javax.xml.transform : Ce package contient l'ensemble des classes et interfaces ncessaires pour travailler avec XSLT (transformation).

-7Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Pour savoir ce que sont SAX, DOM, XSLT et savoir quand et comment les utiliser regardez : Que sont les API SAX, DOM et XSLT ?. lien : Que sont les API SAX, DOM et XSLT ?

Que sont les API SAX, DOM et XSLT ?


Auteurs : Ioan Calapodescu , Les API SAX, DOM et XSLT sont les trois composantes de l'API JAXP. Voici leurs fonctionnalits et principes : SAX : Simple API for XML travaille les documents XML de manire venementielle. C'est dire que le parseur va lire (parcourir) le fichier ou flux XML et lever tout un ensemble d'vnements lors de la rencontre avec un lment. Les lments pouvant tre des balises (ouvrantes ou fermantes), des portions de texte, des commentaires ou encore des instructions. Cette API est particulirement mise en avant pour sa rapidit de traitement. Par contre, son fonctionnement est peut-tre un peu plus complexe aprhender que celui de DOM. Pour bien comprendre la structure et le fonctionnement de cette API regardez : Comment fonctionne l'API SAX ? . DOM : Document Object Model, la diffrence de SAX, ne va pas seulement parcourir le document XML, mais va, en plus, en fabriquer une reprsentation en mmoire. Cette reprsentation est un arbre, que vous pourrez facilement parcourir (cf. org.w3c.dom.Document). Cet arbre reprsente l'organisation et le contenu du document XML. En contrepartie de sa facilit d'utilisation, DOM est plus gourmand en ressources et en temps. Pour dbuter avec DOM regardez : Comment ouvrir un fichier XML avec DOM ? . XSLT : eXtensible Stylesheet Language for Transformations, permet la transformation des documents XML. Les "transformations" consistent soit en une modification d'un XML avec sauvegarde des modifications, soit en une transformation en un autre type de document (HTML et PDF, par exemple). Quelle que soit votre manire de lire votre document XML (SAX ou DOM), vous serez amen utiliser XSLT pour sa modification. lien : Comment fonctionne l'API SAX ? lien : Comment ouvrir un fichier XML avec DOM ?

Quelles autres fonctionnalits sont accessibles avec JAXP ?


Auteurs : Ioan Calapodescu , SAX, DOM et XSLT sont les principales fonctionnalits offertes par JAXP. Mais ce ne sont pas les seules. Voici une liste plus dtaille des spcifications supportes par JAXP 1.3 : SAX 2.0.2 : http://www.saxproject.org/ XML 1.1 : http://www.w3.org/TR/xml11/ XML 1.0 : http://www.w3.org/TR/REC-xml XInclude : http://www.w3.org/TR/xinclude/ DOM Level 3 Core : http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407 DOM Level 3 Load and Save : http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407 W3C XML Schema : http://www.w3.org/TR/xmlschema-1/ XSLT 1.0 : http://www.w3.org/TR/1999/REC-xslt-19991116 XPath 1.0 : http://www.w3.org/TR/xpath

-8Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Pour des dtails sur les autres versions de JAXP, vous pouvez regarder les liens ci-dessous. lien : Quels sont les rapports entre les versions de JAXP et celles des spcifications XML ? lien : Quels sont les parseurs XML et processeurs XSLT utiliss par JAXP RI ?

Quels sont les rapports entre les versions de JAXP et celles des spcifications XML ?
Auteurs : Ioan Calapodescu , Voici les diffrentes versions des spcifications XML supportes par JAXP RI (Reference Implementation) 1.2 et 1.3. Versions JAXP RI 1.3 (prsent dans le JDK 1.5) JAXP RI 1.2 (prsent dans le JDK 1.4) XML 1.1/1.0 SAX SAX 2.0.2 DOM DOM 3.0 XSLT XSLT 1.0 XPath XPath 1.0

1.0

SAX 2.0.0

DOM 2.0

XSLT 1.0

-/-

Pour les anciennes versions de JAXP, vous pouvez trouver de plus amples informations partir du site de sun : http:// java.sun.com/xml/jaxp/index.jsp Pour connatre les versions des parseurs et processeurs utiliss par JAXP RI, regardez : Quels sont les parseurs XML et processeurs XSLT utiliss par JAXP RI ? lien : Quels sont les parseurs XML et processeurs XSLT utiliss par JAXP RI ?

Je n'ai pas le dernier JDK. Comment faire pour avoir accs toutes les fonctionnalits de JAXP ?
Auteurs : Ioan Calapodescu , Si vous n'avez pas le dernier JDK et que vous dsirez profiter de toutes les fonctionnalits de JAXP, vous pouvez tlcharger l'API sparment sur Java.NET. JAXP Reference Implementation Project : https://jaxp.dev.java.net/ N'oubliez pas que vous pouvez aussi tlcharger d'autres API pour travailler avec XML. Certaines sont plus faciles, performantes ou compltes que JAXP.

Quels sont les parseurs XML et processeurs XSLT utiliss par JAXP RI ?
Auteurs : Ioan Calapodescu , Voici les diffrents parseurs XML et processeurs XSLT utiliss par JAXP RI (Reference Implementation) versions 1.3 , 1.2 et 1.1. Outils/versions JAXP RI 1.3 JAXP RI 1.2 JAXP RI 1.1 Parseur XML Xerces 2.6.2 Xerces 2.3.0 Crimson Processeur XSLT XSLTC (bas sur Xalan 2.6.0) XSLTC (bas sur Xalan 2.4.1) XSLTC

-9Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Vous pouvez changer ces outils, s'ils ne vous conviennent pas. Pour cela, vous pouvez regarder les liens ci-dessous. lien : Comment changer le parseur XML ou le processeur XSLT ?

Comment changer le parseur XML ou le processeur XSLT ?


Auteurs : Ioan Calapodescu , Pour changer le parseur XML utilis vous devez spcifier la variable d'environnement javax.xml.parsers.XXX, ou XXX dtermine l'implmentation qui vous intresse. Voici quelques exemples : Exemple DOM
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "net.sf.saxon.om.DocumentBuilderFactoryImpl"); DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();

Ou alors : Exemple SAX


System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.crimson.jaxp.SAXParserFactoryImpl");

Vous pouvez aussi faire ces modifications en ligne de commande. Par exemple : Ligne de commande
java -Djavax.xml.parsers.XXXFactory=nom.complet.de.l.implementation ...

Pour le processeur XSLT la dmarche est la mme, il suffit d'indiquer au systme quelle implmentation du processeur XSLT il doit utiliser. Naturellement, vous pouvez utiliser directement les implmentations (sans passer par les factory), mais cela vous fait perdre la "portabilit" de votre code. En effet, en cas de changement de parseur ou processeur, vous devrez changer de nombreuses parties de votre code. Le plus simple reste de spcifier l'implmentation utiliser grce aux proprits systme.

Comment chercher une DTD dans le CLASSPATH (SAX et DOM) ?


Auteurs : bulbo , Cette solution utilise la spcification JAXP 1.2. La DTD sera dcrite ainsi dans le document XML:

<!DOCTYPE document SYSTEM "file:MaDtd.dtd" >

Ainsi, lors des tests, il sera aussi possible de placer le fichier "MaDtd.dtd" dans le rpertoire ou l'application sera lance. Pour SAX: Dans le DefaultHandler redfinir la mthode resolveEntity comme suit :

- 10 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

public InputSource resolveEntity(String publicId, String systemId) throws SAXException { try { if (!systemId.startsWith("file:")) { return null; } String pathDtd = systemId.substring(5); if (!pathDtd.startsWith("/")) { pathDtd = "/" + pathDtd; } InputStream is = getClass().getResourceAsStream(pathDtd); if (null == is) { return null; } return new InputSource(is); } catch (Exception e) { return null; } }

Lorsque cette mthode retourne null, le parser XML utilise sa mthode de recherche par dfaut pour trouver la DTD. Ce qui fait que ce code n'empche pas de trouver une DTD situe ailleurs du moment que l'URL est correcte. Pour dire au parser SAX d'utiliser cette methode resolveEntity:

SAXParser parser =... parser.getXMLReader().setEntityResolver(monHandler);

Pour DOM: Pour DOM il faut qu'une classe implmente l'interface EntityResolver. Le code de la mthode resolveEntity est exactement le mme que pour SAX. Pour spcifier au parser DOM quelle mthode utiliser:

DocumentBuilder builder = ... builder.setEntityResolver(new MonEntityResolver());

Ou trouver plus d'informations sur le format XML ?


Auteurs : Ioan Calapodescu , Si vous dsirez plus d'informations sur le standard XML et ses applications, je vous invite parcourir ces liens : Cours et tutoriels XML

- 11 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Forum d'entraide XML Les meilleurs livres sur XML Site officiel du W3C

Quelles autres API existent pour travailler avec XML ?


Auteurs : Ioan Calapodescu , JAXP n'est pas la seule API Java ddie XML. On peut mme dire qu'il y en a beaucoup. Certaines sont trs spcialise (sur la technologie J2EE par exemple), d'autres sont plus gnralistes et reprennent/consolident/amliorent les composantes de JAXP. Je vous laisse les dcouvrir par vous mme : JDOM : JDOM se veut une API lgre, rapide et facile d'utilisation, pour travailler avec des documents XML. Son fonctionnement est "comparable" DOM. Compatible avec SAX, DOM et JAXP. DOM4J : API Open Source qui permet le travail avec XML, XPath et XSLT. Compatible avec SAX, DOM et JAXP. StAX : Streaming API for XML JAXB : Java Architecture for XML Binding JAXR : Java API for XML Registries JAX-RPC : Java API for XML-based RPC SAAJ : SOAP with Attachments API for Java

Pour l'utilisation des quatre dernires API, vous pouvez regarder le J2EE 1.4 Tutorial de Sun.

- 12 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Sommaire > SAX Comment fonctionne l'API SAX ?


Auteurs : Ioan Calapodescu , Architecture d'une application utilisant SAX :

Source image : J2EE 1.4 Tutorial Pour commencer, l'application rcupre un parseur (javax.xml.parsers.SAXParser) partir d'une fabrique de parseurs (javax.xml.parsers.SAXParserFactory). Ce parseur parcourt le document XML grce un lecteur (org.xml.sax.XMLReader). Ce dernier contient plusieurs gestionnaires (ou handlers). Ce sont ces diffrents gestionnaires qui sont chargs du traitement des "vnements" lors du parsing. Voici les quatre principaux types de handlers (interfaces du package org.xml.sax) : Gestionnaire de Contenu : Le ContentHandler est charg des vnements comme le dbut ou la fin du document, l'ouverture ou a fermeture de balises ou encore la lecture de caractres. Gestionnaire d'Erreurs : Le ErrorHandler va traiter les trois types d'erreurs possibles lors du parsing : les erreurs simples, les erreurs fatales et les warnings. Gestionnaire de DTD : Le DTDHandler (Document Type Definition) gre les vnements relatifs aux DTD. Gestionnaire d'entits externes : L'EntityResolver est charg de grer les entits externes, en fournissant une InputSource adquate.

Doit-on implmenter les quatre types de handlers ?


Auteurs : Ioan Calapodescu , Non, ce n'est pas ncessaire. Il faut utiliser la classe DefaultHandler du package org.xml.sax.helpers.

- 13 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Le fonctionnement de cette classe peut tre compar celui des adapters pour les listeners (AWT et Swing). C'est dire que cette classe propose une implmentation par dfaut des quatres types de gestionnaires. Vous avez simplement besoin d'tendre cette classe afin d'implmenter les mthodes qui vous sont utiles. Pour un exemple, regardez : Comment parser un XML avec SAX ?. Vous pouvez aussi regarder du ct de la classe org.xml.sax.ext.DefaultHandler2, qui propose en plus des quatre handlers de base une implmentation par dfaut de DeclHandler, EntityResolver2 et LexicalHandler. Ces trois gestionnaires sont des extensions pour SAX2. lien : Comment parser un XML avec SAX ?

Comment crer un parseur avec SAX ?


Auteurs : Ioan Calapodescu , Voici un exemple de cration de parseur SAX utilisant un DefaultHandler.

import import import import

org.xml.sax.*; org.xml.sax.helpers.*; javax.xml.parsers.*; java.io.*;

public class ExempleSAX { public static void main(String[] args){ try{ // cration d'une fabrique de parseurs SAX SAXParserFactory fabrique = SAXParserFactory.newInstance(); // cration d'un parseur SAX SAXParser parseur = fabrique.newSAXParser(); // lecture d'un fichier XML avec un DefaultHandler File fichier = new File("./ExempleSAX.xml"); DefaultHandler gestionnaire = new DefaultHandler(); parseur.parse(fichier, gestionnaire); }catch(ParserConfigurationException pce){ System.out.println("Erreur de configuration du parseur"); System.out.println("Lors de l'appel newSAXParser()"); }catch(SAXException se){ System.out.println("Erreur de parsing"); System.out.println("Lors de l'appel parse()"); }catch(IOException ioe){ System.out.println("Erreur d'entre/sortie"); System.out.println("Lors de l'appel parse()"); } } }

Ce code ne fait "rien", dans le sens que vous n'aurez aucun effet visible lors de son excution. Cet exemple met juste en vidence l'obtention du parseur et les types d'exception susceptibles d'tre leves. Pour un exemple d'implmentation de DefaultHandler regardez : Comment parser un XML avec SAX ?. Voici quelques proprits du parseur (SAXParser) que vous pouvez spcifier la fabrique (SAXParserFactory) : setValidating(boolean) : indique si les parseurs produits par la fabrique doivent valider la DTD. Par dfaut, cette valeur est false.

- 14 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

setSchema(Schema) : indique que les parseurs produits par la fabrique doivent valider le document XML selon un schma XML W3C. setFeature(String, boolean) : permet d'indiquer une proprit particulire pour les parseurs produits par la fabrique. Pour une liste de ces proprits, regardez le lien ci-dessous. setNamespaceAware(boolean) : indique si les parseurs, produits par la fabrique, supportent les espaces de nommage XML.

Pour finir, vous pouvez configurer encore plus profondment votre parseur avec la mthode setProperty(String, Object) de la classe SAXParser. Pour une liste des features et properties, vous pouvez regarder la description du package org.xml.sax. Pour un exemple simple (affichage sur la sortie standard du XML) tlchargez le fichier ci-dessous. Pour un exemple plus complet, regardez : Comment parser un XML avec SAX ?. lien : Comment parser un XML avec SAX ? ExempleSAX.zip

Comment parser un XML avec SAX ?


Auteurs : Ioan Calapodescu , Imaginons le fichier XML suivant, qui reprsente un "annuaire" : Annuaire XML
<annuaire> <personne id="0"> <nom>nom0</nom> <prenom>prenom0</prenom> <adresse>adresse0</adresse> </personne> <personne id="1"> <nom>nom1</nom> <prenom>prenom1</prenom> <adresse>adresse1</adresse> </personne> </annuaire>

Voici un simple JavaBean Personne nous permettant de reprsenter une entre dans cet annuaire : Personne
public class Personne{ private int id; private String nom, prenom, adresse; public Personne(){} public public public public public public public public int getId(){return id;} String getNom(){return nom;} String getPrenom(){return prenom;} String getAdresse(){return adresse;} void void void void setId(int id){this.id = id;} setNom(String nom){this.nom = nom;} setPrenom(String prenom){this.prenom = prenom;} setAdresse(String adresse){this.adresse = adresse;}

- 15 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Personne
public String toString(){ return new StringBuffer("Nom : ").append(nom).append(", ") .append("Prenom : ").append(prenom).append(", ") .append("Adresse : ").append(adresse) .toString(); } }

Finalement, voici le DefaultHandler nous permettant le parsing du XML. Le parsing va simplement rcuprer une List de Personne. PersonneHandler
public class PersonneHandler extends DefaultHandler{ //rsultats de notre parsing private List<Personne> annuaire; private Personne personne; //flags nous indiquant la position du parseur private boolean inAnnuaire, inPersonne, inNom, inPrenom, inAdresse; //buffer nous permettant de rcuprer les donnes private StringBuffer buffer; // simple constructeur public PersonneHandler(){ super(); } //dtection d'ouverture de balise public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{ if(qName.equals("annuaire")){ annuaire = new LinkedList&lt;Personne&gt;(); inAnnuaire = true; }else if(qName.equals("personne")){ personne = new Personne(); try{ int id = Integer.parseInt(attributes.getValue("id")); personne.setId(id); }catch(Exception e){ //erreur, le contenu de id n'est pas un entier throw new SAXException(e); } inPersonne = true; }else { buffer = new StringBuffer(); if(qName.equals("nom")){ inNom = true; }else if(qName.equals("prenom")){ inPrenom = true; }else if(qName.equals("adresse")){ inAdresse = true; }else{ //erreur, on peut lever une exception throw new SAXException("Balise "+qName+" inconnue."); } } } //dtection fin de balise public void endElement(String uri, String localName, String qName) throws SAXException{ if(qName.equals("annuaire")){ inAnnuaire = false; }else if(qName.equals("personne")){ annuaire.add(personne); personne = null;

- 16 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

PersonneHandler
inPersonne = false; }else if(qName.equals("nom")){ personne.setNom(buffer.toString()); buffer = null; inNom = false; }else if(qName.equals("prenom")){ personne.setPrenom(buffer.toString()); buffer = null; inPrenom = false; }else if(qName.equals("adresse")){ personne.setAdresse(buffer.toString()); buffer = null; inAdresse = false; }else{ //erreur, on peut lever une exception throw new SAXException("Balise "+qName+" inconnue."); } } //dtection de caractres public void characters(char[] ch,int start, int length) throws SAXException{ String lecture = new String(ch,start,length); if(buffer != null) buffer.append(lecture); } //dbut du parsing public void startDocument() throws SAXException { System.out.println("Dbut du parsing"); } //fin du parsing public void endDocument() throws SAXException { System.out.println("Fin du parsing"); System.out.println("Resultats du parsing"); for(Personne p : annuaire){ System.out.println(p); } } }

L'utilisation de ces trois lments se fait simplement comme ceci :

SAXParserFactory fabrique = SAXParserFactory.newInstance(); SAXParser parseur = fabrique.newSAXParser(); File fichier = new File("./ExempleSAX.xml"); DefaultHandler gestionnaire = new PersonneHandler(); parseur.parse(fichier, gestionnaire);

Il existe des API plus avances que SAX pour lier des fichiers XML et des Object Java. L'exemple ci-dessus sert juste de dmonstration. PersonneHandler.zip

Comment grer les erreurs durant le parsing ?


Auteurs : Ioan Calapodescu , Au niveau du document XML, il existe deux types d'erreurs possibles. Le document peut tre non valide. Dans ce cas, le document n'obit pas la DTD ou au schma qu'on lui a impos.

- 17 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Le document peut tre mal form. Dans ce cas, il y a simplement une erreur par rapport au standard XML lui mme. Par exemple, des balises mal fermes ou se chevauchant.

Par contre, au niveau du parseur SAX, il existe trois niveaux d'erreurs. Ces trois niveaux d'erreurs sont reprsentes au niveau du Gestionnaire d'Erreurs (ErrorHandler) : Erreur fatale (fatalError(SAXParseException exception) throws SAXException) : Cette erreur ne peut tre rcupre. C'est le cas par exemple pour un document mal form. Aprs ce type d'erreur, le parseur SAX arrte son travail. Erreur (error(SAXParseException exception) throws SAXException) : Cette erreur peut tre rcupre, c'est dire que le parseur SAX peut continuer traiter le reste du document XML. Ce genre d'erreur peut se produire lors d'une violation d'une contrainte impose par la DTD ou le schma. Warning (warning(SAXParseException exception) throws SAXException) : C'est un simple avertissement. Aprs cel, le parseur SAX continue le parsing du document.

Pour plus d'information sur ces erreurs, vous pouvez regarder XML 1.0 W3C Recommendation. Par dfaut (cf. DefautHandler), seules les erreurs fatales sont "traites". Voici un exemple d'implmentation de ErrorHandler. Cet exemple dtaille sur la sortie standard les erreurs simples et warnings et lve une SAXException pour les erreurs fatales :

protected String message(SAXParseException e){ String message = "Message : "+e.getMessage()+"\n"; message += "Ligne "+e.getLineNumber()+", colonne "+e.getColumnNumber()+"\n"; message += "Public id : "+e.getPublicId()+"\n"; message += "System id : "+e.getSystemId(); return message; } protected void printSAXException(SAXParseException e){ System.out.println(message(e)); if(e.getException() != null){ e.getException().printStackTrace(); } } public void warning(SAXParseException exception) throws SAXException{ System.out.println("*** Warning ***"); printSAXException(exception); } public void error(SAXParseException exception) throws SAXException{ System.out.println("*** Erreur ***"); printSAXException(exception); } public void fatalError(SAXParseException exception) throws SAXException{ String message = "*** Erreur fatale ***\n"; message += message(exception); SAXException se = new SAXException(message, exception); throw se; }

- 18 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Pour un exemple d'utilisation, tlchargez le fichier ci-dessous. ExempleErrorHandlerSAX.zip

Ou trouver plus d'informations sur SAX ?


Auteurs : Ioan Calapodescu , Pour de plus amples informations sur SAX, vous pouvez regarder l'excellent tutoriel de Sbatien Mric : Lecture d'un flux XML via SAX. Vous pouvez avoir d'autres informations sur l'utilisation de SAX, en anglais cette fois ci, dans le J2EE 1.4 Tutorial.

lien : lien :

Cours Java - Lecture d'un flux XML via SAX J2EE 1.4 Tutorial

- 19 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Sommaire > DOM Comment fonctionne l'API DOM ?


Auteurs : Ioan Calapodescu , Architecture d'une application utilisant DOM :

Source image : J2EE 1.4 Tutorial Pour commencer, l'application rcupre un constructeur de documents (javax.xml.parsers.DocumentBuilder) partir d'une fabrique de constructeurs (javax.xml.parsers.DocumentBuilderFactory). C'est ce constructeur de documents qui va construire le DOM ou document (org.w3c.Document) partir de la source XML. Le Document est la reprsentation, sous forme d'arbre "d'objets", des donnes contenues dans le XML. DOM reste une API de "bas niveau". Si vous voulez travailler de manire plus oriente objet, avec des arbres XML, regardez du ct de jdom et dom4j (cf. Quelles autres API existent pour travailler avec XML ?). Pour un exemple pratique d'utilisation, regardez : Comment ouvrir un fichier XML avec DOM ? . lien : Comment ouvrir un fichier XML avec DOM ? lien : Quelles autres API existent pour travailler avec XML ?

Comment ouvrir un fichier XML avec DOM ?


Auteurs : Ioan Calapodescu , Voici un exemple, qui montre comment ouvrir un fichier XML avec l'API DOM :

- 20 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

import import import import

javax.xml.parsers.*; org.w3c.dom.*; org.xml.sax.*; java.io.*;

public class ExempleDOM{ public static void main(String[] args){ try{ // cration d'une fabrique de documents DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); // cration d'un constructeur de documents DocumentBuilder constructeur = fabrique.newDocumentBuilder(); // lecture du contenu d'un fichier XML avec DOM File xml = new File("ExempleDOM.xml"); Document document = constructeur.parse(xml); //traitement du document //voir ExempleDOM.zip }catch(ParserConfigurationException pce){ System.out.println("Erreur de configuration du parseur DOM"); System.out.println("lors de l'appel fabrique.newDocumentBuilder();"); }catch(SAXException se){ System.out.println("Erreur lors du parsing du document"); System.out.println("lors de l'appel construteur.parse(xml)"); }catch(IOException ioe){ System.out.println("Erreur d'entre/sortie"); System.out.println("lors de l'appel construteur.parse(xml)"); } } }

La configuration de la fabrique est quasiment identique celle d'une fabrique de parseur SAX. Regardez : Comment crer un parseur avec SAX ?. Pour voir comment parcourir votre document, regardez : Comment parcourir l'arborescence d'un DOM ? Vous pouvez tlcharger un exemple simple (affichage sur la sortie standard du DOM) ci-dessous. lien : Comment parcourir l'arborescence d'un DOM ? ExempleDOM.zip

Comment grer les erreurs durant la cration d'un DOM ?


Auteurs : Ioan Calapodescu , Tout comme pour SAX, on peut grer les erreurs lors de la construction d'un Document grce un ErrorHandler. Par exemple :

public class GestionnaireDErreurs implements ErrorHandler{ protected String message(SAXParseException e){ String message = "Message : "+e.getMessage()+"\n"; message += "Ligne "+e.getLineNumber()+", colonne "+e.getColumnNumber()+"\n"; message += "Public id : "+e.getPublicId()+"\n"; message += "System id : "+e.getSystemId(); return message; } protected void printSAXException(SAXParseException e){

- 21 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

System.out.println(message(e)); if(e.getException() != null){ e.getException().printStackTrace(); } } public void warning(SAXParseException exception) throws SAXException{ System.out.println("*** Warning ***"); printSAXException(exception); } public void error(SAXParseException exception) throws SAXException{ System.out.println("*** Erreur ***"); printSAXException(exception); } public void fatalError(SAXParseException exception) throws SAXException{ String message = "*** Erreur fatale ***\n"; message += message(exception); SAXException se = new SAXException(message, exception); throw se; } }

Exemple d'utilisation :

// cration d'une fabrique de documents DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); // cration et configuration du constructeur de documents DocumentBuilder constructeur = fabrique.newDocumentBuilder(); constructeurs.setErrorHandler(new GestionnaireDErreurs()); Document document = constructeur.parse(new File("ExempleDOM.xml"));

lien : Comment grer les erreurs durant le parsing ?

Quelles informations peut on rcuprer sur un DOM ?


Auteurs : Ioan Calapodescu , Vous pouvez obtenir de nombreuses informations sur un document XML partir d'une instance de org.w3c.dom.Document. Voici un exemple rcuprant, partir d'un Document, des informations gnrales, des informations sur le type de document et sur la configuration DOM :

public static void printDOMInfos(Document document){ System.out.println("INFORMATIONS GENERALES"); String uri = document.getDocumentURI(); System.out.println("URI = "+uri); String xVersion = document.getXmlVersion(); System.out.println("Version XML = "+xVersion); String xEncoding = document.getXmlEncoding(); System.out.println("XML encoding = "+xEncoding); String iEncoding = document.getInputEncoding(); System.out.println("Input encoding = "+iEncoding); boolean standalone = document.getXmlStandalone(); System.out.println("XML standalone = "+standalone);

- 22 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

boolean strictError = document.getStrictErrorChecking(); System.out.println("Strict error checking = "+strictError+"\n"); System.out.println("DOCTYPE"); printDoctype(document.getDoctype()); System.out.println("CONFIGURATION"); printDOMConfiguration(document.getDomConfig()); }

Pour le dtail des mthodes printDoctype et printDOMConfiguration, tlchargez le fichier ci-dessous. InfosDOM.zip

Quels sont les diffrents types de nodes ?


Auteurs : Ioan Calapodescu , Avant de commencer parcourir un arbre DOM et en extraire les donnes, il est ncessaire de bien comprendre sa structure. Il est notamment ncessaire de bien faire la distinction entre les diffrents types de nodes. Une erreur couramment commise est le fait de confondre Node et Element. Node (org.w3c.dom.Node) : Un Node (ou noeud) est l'unit de base de l'arbre. Cela peut tre du texte, un lment, une portion CDATA ou encore une instruction. Pour connatre le type d'un Node utilisez la mthode getNodeType(). Element (org.w3c.dom.Element) : L'interface Element dfinit un lment au sens XML (XHTML ou HTML). Un lment est constitu d'un tag, d'attributs et d'un contenu (autres nodes et lments).

Voici les diffrents types de nodes et le rsultat des mthodes capables d'en dcouvrir le contenu.

- 23 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Interface (org.w3c.dom) Attr

getNodeType() getNodeName() getNodeValue() (short) (String) (String) ATTRIBUTE_NODEnom de Le La valeur de l'attribut. l'attribut. CDATASection CDATA_SECTION_NODE "#cdata-section" Le contenu de la section CDATA. Comment COMMENT_NODE "#comment" Le contenu du commentaire. Document DOCUMENT_NODE "#document" null DocumentFragment DOCUMENT_FRAGMENT_NODE null "#documentfragment" DocumentType DOCUMENT_TYPE_NODE type. null Le nom du Element ELEMENT_NODE nom du tag. null Le Entity ENTITY_NODE Le nom de null l'entit. EntityReference ENTITY_REFERENCE_NODE Le nom null de l'entit rference. Notation NOTATION_NODE nom de la Le null notation. ProcessingInstruction PROCESSING_INSTRUCTION_NODE donnes de La cible de Les l'instruction. l'instruction. Text TEXT_NODE "#text" Le texte en luimme.

getAttributes() (NamedNodeMap) null null null null null null Les attributs de l'lment. null null

null null null

Si vous voulez rcuprer le texte contenu dans un node (et dans l'ensemble de ses enfants), utilisez la mthode getTextContent(). Pour viter toute ambiguit lors de l'utilisation d'Element, prfrez les mthodes spcifiques de cette interface (cf. Comment accder au contenu et aux attributs d'un Element ?). lien : Comment parcourir l'arborescence d'un DOM ? lien : Comment accder au contenu et aux attributs d'un Element ?

Comment parcourir l'arborescence d'un DOM ?


Auteurs : Ioan Calapodescu , La premire chose faire pour commencer parcourir votre arbre DOM est de rcuprer la racine.

Document document = ...; Element racine = document.getDocumentElement();

A partir de cette racine, vous pouvez parcourir l'enseble du document. Voici les mthodes utiliser : Mthodes de l'interface Node getChildNodes : retourne une NodeList contenant l'ensemble des nodes enfants. getFirstChild : retourne le premier Node enfant. getLastChild : retourne le dernier Node enfant.

- 24 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

getNextSibling : retourne la prochaine occurrence du Node. getParentNode : retourne le noeud parent du Node. getPreviousSibling: retourne la prcdente occurrence du Node.

Mthodes de l'interface Element getElementsByTagName : retourne une NodeList contenant les lments enfants dont le tag correspond au nom pass en paramtre (* pour renvoyer tous les lments). getElementsByTagNameNS : mme chose que getElementByTagName, avec prise en compte des namespace.

Comment accder au contenu et aux attributs d'un Element ?


Auteurs : Ioan Calapodescu , Pour accder au contenu et aux attributs d'un Element, on peut utiliser les mthodes getTextContent et getAttributesByTagName. Voici un exemple, dans lequel on extrait d'un XHTML les liens et leurs proprits :

public static List<Element> getLinks(String xhtmlUrl) throws Exception{ List<Element< liens = new ArrayList<Element>(); InputStream stream = null; try{ DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); fabrique.setValidating(true); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); URL url = new URL(xhtmlUrl); stream = url.openStream(); Document document = constructeur.parse(stream); Element racine = document.getDocumentElement(); String tag = "a"; NodeList liste = racine.getElementsByTagName(tag); for(int i=0; i<liste.getLength(); i++){ Element e = (Element)liste.item(i); if(e.hasAttribute("href"))liens.add(e); } }catch(Exception e){ throw e; }finally{ try{stream.close();}catch(Exception e){} return liens; } }

Exemple d'utilisation :

String url = "http://www.w3.org/"; List<Element> liens = getLinks(url); for(Element lien : liens){ String href = lien.getAttribute("href"); String texte = lien.getTextContent(); texte = (texte!=null)?texte:href; System.out.println("Lien "+texte+" pointe sur "+href); }

- 25 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Vous pouvez tlcharger cet exemple ci-dessous. Pour avoir plus d'informations sur un Element (ou un attribut) dfinit par un schma, utilisez la mthode getSchemaTypeInfo(). LiensXHTML.zip

Comment connaitre le nombre d'enfants d'un Element ?


Auteurs : Ioan Calapodescu , Cela dpend de ce que vous entendez par "enfant". Comme toujours, il faut bien faire la diffrence entre Node et Element. Nombre d'enfants de type Node

Element e = ...; NodeList enfants = e.getChildNodes(); int nombreDeNoeudsEnfants = enfants.getLength();

Nombre d'enfants de type Element

Element e = ...; NodeList enfants = e.getElementsByTagName("*"); int nombreDElementsEnfants = enfants.getLength();

Cela mritait d'tre soulign car l'erreur (la confusion entre Node et Element) est souvent commise. Ces mthodes sont relativement limites. Pour des oprations plus complexes, regardez du ct de XPath : Qu'est ce que XPath ? Pourquoi l'utiliser ?. lien : Qu'est ce que XPath ? Pourquoi l'utiliser ?

Comment modifier un DOM (document, nodes et lments) ?


Auteurs : Ioan Calapodescu , L'API DOM fournit avec les classes Document, Node et ses drives (Element, par exemple) tout un ensemble de mthodes permettant la modification du document. Voici, en rsum, les mthodes disponibles pour Document, Node et Element : Mthodes de Document adoptNode(Node source) : importe le noeud pass en paramtre. Si ce noeud appartient dj une arborescence, il en est supprim. Le mthode retourne le noeud adopt ou null si l'opration choue. importNode(Node importedNode, boolean deep) : importe, dans le document, le noeud pass en argument et ses enfants (si deep vaut true). Le noeud ainsi import n'a pas de parent. Le noeud ainsi import, contrairement adoptNode, est une simple copie. Le noeud est retourn comme rsultat. renameNode(Node n, String namespaceURI, String qualifiedName) : renomme le noeud pass en paramtre et retourne ce dernier. Attention, seuls les nodes de type item et Attr peuvent tre ainsi renomms. setDocumentURI(String documentURI) : remplace l'URI du document. setXmlStandalone(boolean xmlStandalone) : dfinit si le XML est "standalone" ou non.

- 26 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

setXmlVersion(String xmlVersion) : dfinit la version du XML ("1.0" par dfaut). normalizeDocument() : cette mthode valide les modifications apportes au DOM. Voir aussi la mthode normalize() de l'interface Node.

Mthodes de Node appendChild(Node newChild) : ajoute le noeud pass en paramtre la fin des autres enfants du node. cette mthode retourne le noeud ajout. insertBefore(Node newChild, Node refChild) : insre "newChild" avant "refChild" et retourne "newChild". removeChild(Node oldChild) : supprimme le noeud pass en paramtre et le retourne. replaceChild(Node newChild, Node oldChild) : remplace oldChild par newChild et retourne oldChild. setNodeValue(String nodeValue) : met "nodeValue" comme valeur pour le noeud. Voir Quels sont les diffrents types de nodes ? pour connatre les valeurs possibles. setPrefix(String prefix) : met "prefix" comme nouveau prfixe du noeud. setTextContent(String textContent) : met "textContent" comme contenu du noeud. Attention, ceci supprimme l'ensemble des noeuds enfants.

Mthodes de Element removeAttribute(String name) : supprimme l'attribut nomm. setAttribute(String name, String value) : cre un nouvel attribut (ou modifie la valeur de l'attribut si il existe dj). setIdAttribute(String name, boolean isId) : cre un nouvel attribut de type ID (ou modifie la valeur de l'attribut si il existe dj).

Ces trois mthodes ont toutes des variantes. Les mthodes XXXNode permettent notamment de retourner l'instance de Attr modifie ou supprimme. Pour un exemple d'utilisation de quelques une de ces mthodes, regardez Comment crer un DOM de toutes pices?. Ces mthodes ne modifient que l'arbre en mmoire. Pour modifier la source XML, vous devez utiliser XSLT : Comment crer ou modifier un fichier XML avec DOM et XSLT ?. lien : Comment crer ou modifier un fichier XML avec DOM et XSLT ? lien : Comment crer un DOM de toutes pices? lien : Quels sont les diffrents types de nodes ?

Comment crer un DOM de toutes pices?


Auteurs : Ioan Calapodescu , La classe DocumentBuilder permet de crer une nouvelle instance de Document grce la mthode newDocument(). Pour le reste, Document fournit un ensemble de mthodes createXXX, qui vont vous permettre de crer des nodes, lments, commentaires et attributs. Voici un exemple :

// Cration d'un nouveau DOM DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); Document document = constructeur.newDocument(); // Proprits du DOM document.setXmlVersion("1.0");

- 27 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

document.setXmlStandalone(true); // Cration de l'arborescence du DOM Element racine = document.createElement("annuaire"); racine.appendChild(document.createComment("Commentaire sous la racine")); Element personne = document.createElement("personne"); personne.setAttribute("id","0"); racine.appendChild(personne); Element nom = document.createElement("nom"); nom.setTextContent("un nom"); personne.appendChild(nom); Element prenom = document.createElement("prenom"); prenom.setTextContent("un prnom"); personne.appendChild(prenom); Element adresse = document.createElement("adresse"); adresse.setTextContent("une adresse"); personne.appendChild(adresse); document.appendChild(racine);

Transform en XML ce DOM donnerait :

<?xml version="1.0" encoding="ISO-8859-1"?> <annuaire> <!--Commentaire sous la racine--> <personne id="0"> <nom>un nom</nom> <prenom>un prnom</prenom> <adresse>une adresse</adresse> </personne> </annuaire>

Pour sauvegarder ce DOM sous forme de XML, vous devrez utiliser XSLT (cf. Comment crer ou modifier un fichier XML avec DOM et XSLT ?). Vous pouvez tlcharger une exemple ci-dessous. lien : Comment crer ou modifier un fichier XML avec DOM et XSLT ? CreationDOM.zip

Comment convertir un XML DOM en String ?


Auteurs : willowII , Le bout de code suivant utilise la classe Transformer pour crire un document DOM dans une String en passant par un StringWriter.

Document document = ...; DOMSource domSource = new DOMSource(document); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(domSource, result); String stringResult = writer.toString();

- 28 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Sommaire > XSLT Comment fonctionne l'API XSLT ?


Auteurs : Ioan Calapodescu , Architecture d'une application utilisant XSLT :

Source image : J2EE 1.4 Tutorial L'application commence par rcuprer un transformeur (javax.xml.transform.Transformer) partir d'une fabrique de transformeurs (javax.xml.transform.TransformerFactory). C'est ce transformeur qui va tre charg de transformer une source (javax.xml.transform.Source) en rsultat (javax.xml.transform.Resultat). Par dfaut, si aucune vritable transformation n'est demande, le transformeur va simplement copier la source dans le rsultat. La source et le rsultat peuvent tre respectivement un parseur SAX, un DOM, une InputSource et un ensebble d'vnements SAX, un DOM ou une OutputSource. Pour une configuration pratique du transformeur, regardez : Comment crer et configurer un Transformer (pour SAX et DOM) ? Pour des exemples, regardez : Comment crer ou modifier un fichier XML avec DOM et XSLT ? et Comment crer ou modifier un fichier XML avec SAX et XSLT ? lien : Comment crer et configurer un Transformer (pour SAX et DOM) ? lien : Comment crer ou modifier un fichier XML avec DOM et XSLT ?

- 29 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

lien : Comment crer ou modifier un fichier XML avec SAX et XSLT ?

Comment crer et configurer un Transformer (pour SAX et DOM) ?


Auteurs : Ioan Calapodescu , Voici un exemple de cration et de configuration d'un Transformer :

// cration de la fabrique TransformerFactory fabrique = TransformerFactory.newInstance(); // rcupration du transformeur Transformer transformer = fabrique.newTransformer(); /** * pour dfinir une feuille de style, vous pouvez utiliser une Source comme paramtre * File stylesheet = new File("stylesheet.xsl"); * StreamSource stylesource = new StreamSource(stylesheet); * Transformer transformer = fabrique.newTransformer(stylesource); */ // configuration du transformeur transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");

Pour configurer votre fabrique, regardez par exemple : Comment grer les erreurs durant la transformation ? . Pour connatre toutes les clefs disponibles pour le Transformer, regardez la classe javax.xml.transform.OutputKeys. lien : Comment grer les erreurs durant la transformation ?

Que sont les Templates cres par TransformerFactory?


Auteurs : Ioan Calapodescu , Les fabriques de transformeurs (javax.xml.transform.TransformerFactory) peuvent construire deux types d'objets : les Transformer et les Templates. Une Template est un "conteneur" de Transformer. De plus, contrairement un simple Transformer, la Template est "thread-safe" (elle peut tre utilise par plusieurs Threads sans risque). La cration et configuration d'une Template se font de la mme manire que pour un Transformer. Par exemple :

// cration de la fabrique TransformerFactory fabrique = TransformerFactory.newInstance(); // rcupration de Templates Templates template = fabrique.newTemplates(); /** * pour dfinir une feuille de style, vous pouvez utiliser une Source comme paramtre * File stylesheet = new File("stylesheet.xsl"); * StreamSource stylesource = new StreamSource(stylesheet); * Templates template = fabrique.newTemplates(stylesource); */ // configuration du transformeur Transformer transformer = template.getTransformer();

- 30 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");

lien : Comment crer et configurer un Transformer (pour SAX et DOM) ?

Comment grer les erreurs durant la transformation ?


Auteurs : Ioan Calapodescu , La gestion des erreurs se fait de la mme manire que pour SAX/DOM et les ErrorHandler. On peut grer les erreurs durant la transformation avec un ErrorListener (javax.xml.transform). Par exemple :

import javax.xml.transform.*; public class EcouteurDErreurs implements ErrorListener{ public void warning(TransformerException exception) throws TransformerException{ printException(exception); } public void error(TransformerException exception) throws TransformerException{ printException(exception); } public void fatalError(TransformerException exception) throws TransformerException{ printException(exception); throw exception; } private void printException(TransformerException exception){ String message = exception.getMessageAndLocation() ; System.out.println(message); } }

Utilisation :

Transformer transformeur = ...; transformeur.setErrorListener(new EcouteurDErreurs());

lien : Comment grer les erreurs durant le parsing ? lien : Comment grer les erreurs durant la cration d'un DOM ?

Comment crer ou modifier un fichier XML avec DOM et XSLT ?


Auteurs : Ioan Calapodescu , Voici une mthode permettant de crer un fichier XML partir d'un DOM :

public static void transformerXml(Document document, String fichier) { try { // Cration de la source DOM Source source = new DOMSource(document); // Cration du fichier de sortie File file = new File(fichier); Result resultat = new StreamResult(fichier); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance();

- 31 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat); }catch(Exception e){ e.printStackTrace(); } }

Vous pouvez tlcharger les sources d'un exemple complet ci-dessous. lien : Comment crer ou modifier un fichier XML avec SAX et XSLT ? lien : Comment crer un fichier HTML partir d'un XML ? lien : Comment crer un fichier PDF partir d'un XML ? CreationDOM.zip

Comment crer ou modifier un fichier XML avec SAX et XSLT ?


Auteurs : Ioan Calapodescu , Pour crer un fichier XML avec SAX et XSLT, il nous faut crer une SAXSource. Nous allons prendre l'exemple de l'criture dans un fichier d'un "annuaire" compos d'une List de JavaBean Personne. Voici les tapes ncessaires sa cration de la source : Cration du bean : Personne dfinit un lment de l'annuaire.. Cration d'une InputSource : AnnuaireSource dfinit la List des personnes de l'annuaire. Cration d'un XMLReader : AnnuaireReader est capable de "parser" la source pour lever des vnements SAX. Cration de la SAXSource, partir de l'InputSource et du Reader.

Aprs cel la transformation se fera comme pour un arbre DOM et un fichier : avec un Transformer et un StreamResult (pour le fichier de destination). Personne
/** * Voir zip */

AnnuaireSource
public class AnnuaireSource extends InputSource{ private List<Personne> personnes; public AnnuaireSource(List<Personne> personnes){ super(); this.personnes = personnes; } public List<Personne> getPersonnes(){ return personnes; } // En fait, contrairement cet exemple de nombreuses mthodes d'InputSource travaillent avec des streams. // Cela peut vous simplifier le travail sur des fichiers XML existants. }

AnnuaireReader
public class AnnuaireReader implements XMLReader{ private ContentHandler handler;

- 32 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

AnnuaireReader
private AttributesImpl atts = new AttributesImpl(); //mthode qui vont tre utilises par le transformer public ContentHandler getContentHandler(){ return handler; } public void setContentHandler(ContentHandler handler){ this.handler = handler; } // parsing d'une liste de personnes public void parse(InputSource input) throws IOException,SAXException{ if(!(input instanceof AnnuaireSource)){ String m = "Le seul argument possible pour parse est une AnnuaireSource"; throw new SAXException(m); } if(handler == null){ throw new SAXException("Pas de ContentHandler"); } AnnuaireSource source = (AnnuaireSource)input; List<Personne> personnes = source.getPersonnes(); handler.startDocument(); handler.startElement("", "annuaire", "annuaire", atts); for(Personne p : personnes){ atts.addAttribute("","id","id","",String.valueOf(p.getId())); handler.startElement("", "personne", "personne", atts); atts.clear(); handler.startElement("", "nom", "nom", atts); char[] nom = p.getNom().toCharArray(); handler.characters(nom,0,nom.length); handler.endElement("", "nom", "nom"); handler.startElement("", "prenom", "prenom", atts); char[] prenom = p.getPrenom().toCharArray(); handler.characters(prenom,0,prenom.length); handler.endElement("", "prenom", "prenom"); handler.startElement("", "adresse", "adresse", atts); char[] adresse = p.getAdresse().toCharArray() ; handler.characters(adresse,0,adresse.length); handler.endElement("", "adresse", "adresse"); handler.endElement("", "personne", "personne"); } handler.endElement("", "annuaire", "annuaire"); handler.endDocument(); } public void parse(String systemId) throws IOException,SAXException{ String m = "Le seul argument possible pour parse est une AnnuaireSource"; throw new SAXException(m); } // autres mthodes implmenter }

Exemple d'utilisation :

// Cration de l'annuaire List<Personne> annuaire = new ArrayList<Personne>(); // ... //remplissage de l'annuaire // Cration de la source DOM XMLReader annuaireReader = new AnnuaireReader(); InputSource annuaireSource = new AnnuaireSource(annuaire);

- 33 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Source source = new SAXSource(annuaireReader, annuaireSource); // Cration du fichier de sortie File file = new File("CreationSAX.xml"); Result resultat = new StreamResult(file); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat);

Tlchargez le code source complet ci-dessous. lien : Comment crer ou modifier un fichier XML avec DOM et XSLT ? lien : Comment crer un fichier HTML partir d'un XML ? lien : Comment crer un fichier PDF partir d'un XML ? SaxXSLT.zip

Comment crer un fichier HTML partir d'un XML ?


Auteurs : Ioan Calapodescu , La cration d'un document HTML avec XSLT passe par l'utilisation d'une feuille de style (XSL). Voici le code utiliser :

public static void creerHTML(String xml, String xsl, String html) throws Exception{ // Cration de la source DOM DocumentBuilderFactory fabriqueD = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabriqueD.newDocumentBuilder(); File fileXml = new File(xml); Document document = constructeur.parse(fileXml); Source source = new DOMSource(document); // Cration du fichier de sortie File fileHtml = new File(html); Result resultat = new StreamResult(fileHtml); // Configuration du transformer TransformerFactory fabriqueT = TransformerFactory.newInstance(); StreamSource stylesource = new StreamSource(xsl); Transformer transformer = fabriqueT.newTransformer(stylesource); transformer.setOutputProperty(OutputKeys.METHOD, "html"); // Transformation transformer.transform(source, resultat); }

Vous pouvez tlcharger ci-dessous un exemple simple avec xml, xsl et classe de test. lien : Comment crer ou modifier un fichier XML avec DOM et XSLT ?

- 34 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

lien : Comment crer un fichier PDF partir d'un XML ? CreationHTML.zip

Comment crer un fichier PDF partir d'un XML ?


Auteurs : Ioan Calapodescu , L'API standard ne fournit pas de mcanisme pour transformer un XML en PDF. Par contre, une trs bonne librairie existe pour ca : FOP (Formatting Object Processor). Voici un exemple d'utilisation de FOP :

public static void creerPDF(String xml, String xsl, String pdf) throws Exception{ // cration du rsultat (pdf) Driver driver = new Driver(); driver.setRenderer(Driver.RENDER_PDF); driver.setOutputStream(new java.io.FileOutputStream(pdf)); Result resultat = new SAXResult(driver.getContentHandler()); // rcupration de la source xml Source source = new StreamSource(xml); // cration du transformer en fonction du xsl Source style = new StreamSource(xsl); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(style); // transformation transformer.transform(source, resultat); }

Vous pouvez tlcharger un exemple complet avec xml et xsl ci dessous. Verifiez bien que la librairie FOP (et ses dpendances) se trouve bien dans votre classpath avant de compiler/excuter l'exemple. lien : Comment crer un fichier HTML partir d'un XML ? CreationPDF.zip

Comment enchaner les transformations XSLT ?


Auteurs : Ioan Calapodescu , Vous pouvez trs bien vouloir enchaner les transformations XSLT. Par enchaner, on entend appliquer plusieurs transformations successives un document XML. Chaque rsultat de transformation devenant ainsi la source de la prochaine. Pour vous aider faire ceci, le package org.xml.sax vous propose la classe XMLFilter. Voici le principe :

- 35 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Source image = J2EE 1.4 Tutorial Voici une mthode prenant en arguments un fichier XML, deux feuilles de style xsl (les transformations enchaner) et un fichier html de sortie.

public static void transformer(File xml, File xsl1, File xsl2, File html) throws Exception{ // Cration du reader initial SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); XMLReader reader = spf.newSAXParser().getXMLReader(); // Cration des filtres appliquer au reader SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); XMLFilter filtre1 = stf.newXMLFilter(new StreamSource(xsl1)); XMLFilter filtre2 = stf.newXMLFilter(new StreamSource(xsl2)); // On "lie" le reader aux filtres filtre1.setParent(reader); filtre2.setParent(filtre1); // Cration de la source : c'est le dernier filtre de la chane // C'est lui qui indiquera au transformer quelles transformations faire "avant" // Le rsultat est le fichier HTML SAXSource source = new SAXSource(filtre2, new InputSource(new FileInputStream(xml))); StreamResult resultat = new StreamResult(new FileOutputStream(html)); //Transformation en chane Transformer transformer = stf.newTransformer(); transformer.transform(source, resultat); }

Vous pouvez tlcharger un exemple complet d'utilisation ci-dessous. ChaineXSLT.zip

- 36 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Sommaire > XPath Qu'est ce que XPath ? Pourquoi l'utiliser ?


Auteurs : Ioan Calapodescu , XPath, ou XML Path Language, est un langage dont le but premier est de permettre la "slection" de noeuds d'un document XML. Cette "slection" se fait grce un systme d'adressage que l'on pourrait comparer aux URL. En plus de cela, XPath fournit un ensemble de fonctions sur les chanes de caractres ou encore des fonctions permettant d'effectuer des tests. XPath peut tre utilis en combinaison avec XSLT et XPointer. Pour dcouvrir toutes les possibilits de ce langage, vous pouvez regarder la spcification du W3C cette adresse : http://www.w3.org/TR/xpath. Nous ne nous attarderons pas sur les complexits de ce langage. De plus, la spcification n'tant pas toujours vidente dcoder vous pouvez regarder "O trouver des informations et cours sur le langage XPath lui-mme ?" pour de plus amples informations. Cette partie de la FAQ se contentera de vous fournir les bases ncessaires l'utilisation du package javax.xml.xpath appartenant au JDK standard depuis Java 5.0. Pour l'utilisation de XPath avec d'autres API ou l'utilisation de ce package avec des JDK antrieurs au 5.0, vous pouvez suivre ces liens : Je n'ai pas le dernier JDK. Comment faire pour avoir accs toutes les fonctionnalits de JAXP ? Comment travailler avec XPath si je n'ai pas Java 5.0 ?

lien : O trouver des informations et cours sur le langage XPath lui-mme ? lien : Je n'ai pas le dernier JDK. Comment faire pour avoir accs toutes les fonctionnalits de JAXP ? lien : Comment travailler avec XPath si je n'ai pas Java 5.0 ?

Comment fonctionne le package javax.xml.xpath ?


Auteurs : Ioan Calapodescu , Voici un schma simplifi du fonctionnement du package javax.xml.xpath :

- 37 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Le principe est simple. On commence par rcuprer une instance de XPath partir d'une fabrique (XPathFactory). Ensuite, on construit une source XML (InputSource) partir du document XML sur lequel on veut travailler. Il ne reste plus qu' construire une XPathExpression partir du XPath. Cette XPathExpression va retourner (grce sa mthode evaluate()) un Object qui peut correspondre un NodeSet, un Node, un String, un Number ou un Boolean. Pour voir le code excutant ces oprations regardez : Comment obtenir une XPathExpression ? Attention : NODE, NUMBER, STRING, etc. sont des instances de QName dfinies comme des constantes de la classe XPathConstants. Il ne faut pas les confondre avec des "vrais" String ou Number. Pour plus d'informations, regardez : Que fait exactement la mthode evaluate ?. lien : Comment obtenir une XPathExpression ? lien : Que fait exactement la mthode evaluate ?

Comment obtenir une XPathExpression ?


Auteurs : Ioan Calapodescu , Voici deux mthodes statiques montrant comment crer une instance de XPath et lui faire valuer une XPathExpression. Exemple avec un Document DOM :

public static void evaluerDOM(Document document, String expression, QName retour){ try{ //cration du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //valuation de l'expression XPath - 38 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

XPathExpression exp = xpath.compile(expression); Object resultat = exp.evaluate(document,retour); System.out.println(resultat); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } }

Exemple avec une InputSource SAX :

public static void evaluerSAX(File fichier, String expression, QName retour){ try{ //cration de la source InputSource source = new InputSource(new FileInputStream(fichier)); //cration du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //valuation de l'expression XPath XPathExpression exp = xpath.compile(expression); Object resultat = exp.evaluate(source,retour); System.out.println(resultat); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); }catch(IOException ioe){ ioe.printStackTrace(); } }

Informations supplmentaires : On peut noter qu'on n'est pas oblig de passer par une instance de XPathExpression. En effet, la classe XPath dispose elle aussi d'une mthode evaluate(). Ainsi, on pourrait remplacer le code de la premire mthode par :

XPath xpath = XPathFactory.newInstance().newXPath(); Object resultat = xpath.evaluate(expression,document,retour);

Pour connatre tous les arguments et types de retour possibles pour la mthode evaluate() regardez : Que fait exactement la mthode evaluate ? Vous pouvez tlcharger un exemple simple d'utilisation de ces deux mthodes ci-dessous. lien : Que fait exactement la mthode evaluate ? ExempleXPath.zip

Que fait exactement la mthode evaluate ?


Auteurs : Ioan Calapodescu , Que ce soit dans la classe XPath ou dans XPathExpression, la mthode evaluate() a quatre variantes. Pour toutes ces mthodes, l'argument de type String nomm expression correspond l'expression XPath valuer.

- 39 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Arguments String expression, Object item, QName returnType

Retour Object

String expression, Object item

String

String expression, InputSource source, QName returnType

Object

String expression, InputSource source

String

Description L'argument item correspond un lment XML valuer. Celui-ci peut tre un Document, un DocumentFragment, un Node ou encore une NodeList (package org.w3c.dom). L'argument returnType doit tre une des constantes de la classe XPathConstants : NUMBER, STRING, BOOLEAN, NODE ou NODESET (une IllegalArgumentException est leve sinon). Cet argument dfinit simplement le type de l'Object retourn par la mthode (voir tableau ci-dessous). Cette mthode a le mme comportement que evaluate(expression, item, returnType) avec returnType gal XPathConstants.STRING. L'argument source correspond la source XML valuer. Celle-ci doit tre une InputSource (package org.xml.sax). L'argument returnType doit tre une des constantes de la classe XPathConstants : NUMBER, STRING, BOOLEAN, NODE ou NODESET (une IllegalArgumentException est leve sinon). Cet argument dfinit simplement le type de l'Object retourn par la mthode (voir tableau ci-dessous). Cette mthode a le mme comportement que evaluate(expression, source, returnType) avec returnType gal XPathConstants.STRING.

Les types de retour correspondent la spcification XPath 1.0 : http://www.w3.org/TR/xpath. Voici les correspondances entre les constantes de XPathConstants (instances de QName) et les types de retour de la mthode evaluate : QName XPathConstants.NODE Type de retour org.w3c.dom.Node Description Quand un Node est requis comme type de retour, la mthode evaluate() retourne une instance de org.w3c.Node correspondant au premier noeud satisfaisant l'expression XPath. Quand un NodeSet est requis comme type de retour, la mthode

XPathConstants.NODESET

org.w3c.dom.NodeList

- 40 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

XPathConstants.STRING

java.lang.String

XPathConstants.BOOLEAN

java.lang.Boolean

XPathConstants.NUMBER

java.lang.Double

evaluate() retourne une instance de org.w3c.NodeList correspondant aux noeuds slectionns par l'expression XPath. Quand un String est requis comme type de retour la mthode evaluate() retourne le contenu du ou des noeuds satisfaisant l'expression XPath (enfants compris). Quand un Boolean est requis comme type de retour la mthode evaluate() retourne Boolean.TRUE si au moins un noeud est slectionn, Boolean.FALSE sinon. Quand un Number est requis comme type de retour la mthode evaluate() essaye de transformer le contenu du noeud slectionn en Double.

Pour un exemple pratique d'utilisation de chacune de ces mthodes regardez les liens ci-dessous. Comment rcuprer un ensemble de noeuds avec XPath ? Comment rcuprer un Node avec XPath ? Comment rcuprer un boolen partir d'une expression XPath ? Comment rcuprer une chane de caractres avec XPath ? Comment rcuprer un nombre partir d'une expression XPath ?

lien : Comment rcuprer un ensemble de noeuds avec XPath ? lien : Comment rcuprer un Node avec XPath ? lien : Comment rcuprer un boolen partir d'une expression XPath ? lien : Comment rcuprer une chane de caractres avec XPath ? lien : Comment rcuprer un nombre partir d'une expression XPath ?

Comment utiliser les espaces de nommage avec XPath ?


Auteurs : Ioan Calapodescu , Pour utiliser les espaces de nommage, vous pouvez utiliser la mthode setNamespaceContext(NamespaceContext) de la classe XPath. Par exemple :

NamespaceContext namespace = new NamespaceContext(){ public String getNamespaceURI(String prefix){ if("content".equals(prefix)){ return "http://purl.org/rss/1.0/modules/content/"; }else{ return null; } } public String getPrefix(String namespaceURI){ if("http://purl.org/rss/1.0/modules/content/".equals(namespaceURI)){ return "content"; }else{ return null; } } public Iterator getPrefixes(String namespaceURI){

- 41 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

return null; } }; XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); xpath.setNamespaceContext(namespace);

Pour voir un exemple d'utilisation, regardez : Comment rcuprer une chane de caractres avec XPath ? lien : Comment rcuprer une chane de caractres avec XPath ?

Comment rcuprer un ensemble de noeuds avec XPath ?


Auteurs : Ioan Calapodescu , Voici un exemple permettant de rcuprer un NodeSet (org.w3c.dom.NodeList) partir d'une expression XPath.

public static NodeList evaluer(InputStream stream, String expression){ NodeList liste = null; try{ //cration de la source InputSource source = new InputSource(stream); //cration du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //valuation de l'expression XPath XPathExpression exp = xpath.compile(expression); liste = (NodeList)exp.evaluate(source,XPathConstants.NODESET); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return liste; }

On peut utiliser cette mthode pour, par exemple, rcuprer l'ensemble des titres des articles publis (RSS 2.0) sur le blog de developpez.com.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=1"); String expression = "//item/title"; System.out.println("Articles disponibles sur le blog de developpez.com"); NodeList liste = evaluer(url.openStream(),expression); if(liste != null){ for(int i=0; i&<liste.getLength(); i++){ Node node = liste.item(i); System.out.println(node.getTextContent()); } }

- 42 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

Vous pouvez tlcharger cet exemple ci-dessous. NodeSetXPath.java

Comment rcuprer un Node avec XPath ?


Auteurs : Ioan Calapodescu , Voici une mthode permettant de rcuprer un Node (package org.w3c.dom) avec XPath.

public static Node evaluer(InputStream stream, String expression){ Node node = null; try{ //cration de la source InputSource source = new InputSource(stream); //cration du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //valuation de l'expression XPath XPathExpression exp = xpath.compile(expression); node = (Node)exp.evaluate(source,XPathConstants.NODE); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return node; }

On peut utiliser cette mthode, par exemple pour rcuprer le titre du premier article publi sur le blog de developpez.com (RSS 2.0).

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=12"); String expression = "rss/channel/item/title"; Node node = evaluer(url.openStream(),expression); System.out.println(node.getTextContent());

Vous pouvez tlcharger l'exemple ci-dessous. NodeXPath.java

Comment rcuprer un boolen partir d'une expression XPath ?


Auteurs : Ioan Calapodescu , Voici une mthode permettant de rcuprer un boolen (java.lang.Boolean) avec XPath.

public static Boolean evaluer(InputStream stream, String expression){ Boolean b = null; try{ //cration de la source InputSource source = new InputSource(stream); //cration du XPath

- 43 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //valuation de l'expression XPath XPathExpression exp = xpath.compile(expression); b = (Boolean)exp.evaluate(source,XPathConstants.BOOLEAN); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return b; }

Cette mthode peut tre utilise, par exemple, pour vrifier si le dernier article publi sur le blog de developpez.com appartient la rubrique Java.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=1"); String expression = "rss/channel/item[position()=1 and contains(./link/text(),'blog=12')]"; Boolean b = evaluer(url.openStream(),expression); String s = ""; if(b){ s = "Le premier message du blog de developpez.com appartient la rubrique Java"; }else{ s = "Le premier message du blog de developpez.com n'appartient pas la rubrique Java"; } System.out.println(s);

Cet exemple est tlchargeable ci-dessous. BooleanXPath.java

Comment rcuprer une chane de caractres avec XPath ?


Auteurs : Ioan Calapodescu , Voici une mthode permettant de rcuprer une chane de caractres (java.lang.String) partir de XPath.

public static String evaluer(InputStream stream, String expression, NamespaceContext namespace){ String string = null; try{ //cration de la source InputSource source = new InputSource(stream); //cration du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); if(namespace != null){ xpath.setNamespaceContext(namespace); } //valuation de l'expression XPath XPathExpression exp = xpath.compile(expression); string = (String)exp.evaluate(source,XPathConstants.STRING); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return string;

- 44 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

On peut utiliser cette mthode pour, par exemple, rcuprer le contenu du premier article publi (RSS 2.0) sur le blog de developpez.com. Ce contenu peut tre directement affich dans un JTextPane.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=1"); String expression = "//item/content:encoded"; NamespaceContext namespace = new NamespaceContext(){ public String getNamespaceURI(String prefix){ if("content".equals(prefix)){ return "http://purl.org/rss/1.0/modules/content/"; }else{ return null; } } public String getPrefix(String namespaceURI){ if("http://purl.org/rss/1.0/modules/content/".equals(namespaceURI)){ return "content"; }else{ return null; } } public Iterator getPrefixes(String namespaceURI){ return null; } }; String article = evaluer(url.openStream(),expression,namespace); JTextPane pane = new JTextPane(); pane.setContentType("text/html"); pane.setPreferredSize(new Dimension(200,200)); JScrollPane scroll = new JScrollPane(pane); JFrame frame = new JFrame(); //etc. frame.setVisible(true); pane.setText(article);

Cet exemple est tlchargeable ci-dessous. StringXPath.java

Comment rcuprer un nombre partir d'une expression XPath ?


Auteurs : Ioan Calapodescu , Voici une mthode permettant de rcuprer un nombre (java.lang.Double) partir de XPath.

public static Double evaluer(InputStream stream, String expression){ Double number = null; try{ //cration de la source InputSource source = new InputSource(stream); //cration du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath();

- 45 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.

FAQ Java XML

//valuation de l'expression XPath XPathExpression exp = xpath.compile(expression); number = (Double)exp.evaluate(source,XPathConstants.NUMBER); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return number; }

Cette mthode peut tre utilise pour, par exemple, compter le nombre de news concernant J2EE et publies (RSS 2.0) sur le blog de la rubrique Java.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=12"); String expression = "count(rss/channel/item/category[text()='3. Technologie J2EE'])"; Double number = evaluer(url.openStream(),expression); System.out.println("Il y a "+number+" news J2EE sur le blog de la rubrique Java");

Cet exemple est tlchargeable ci-dessous. NumberXPath.java

Comment travailler avec XPath si je n'ai pas Java 5.0 ?


Auteurs : Ioan Calapodescu , Depuis J2SE 5.0 (Tiger), l'API standard contient le package javax.xml.xpath, qui permet de travailler avec XPath. Plus d'informations dans la description du package. Pour les versions antrieures de Java, il faut regarder du ct d'autres API comme Xalan-Java 2.6.0: Package org.apache.xpath (NB : cette API tait incluse dans J2SE 1.4). On peut aussi noter l'API JDom qui permet de travailler avec XPath. Enfin, n'oubliez pas que vous pouvez tlcharger JAXP de manire indpendante : https://jaxp.dev.java.net/

O trouver des informations et cours sur le langage XPath lui-mme ?


Auteurs : Ioan Calapodescu , Pour plus d'informations sur XPath lui-mme vous pouvez suivre ces liens : Rubrique XML de developpez.com Tutoriel XPath Forum d'entraide XML, XSL, SOAP, etc. Spcification XPath version 1.0 Spcification XPath version 2.0 (non compatible avec le JDK standard, mais avec d'autres librairies)

- 46 Les codes sources prsents sur cette page sont libres de droits, et vous pouvez les utiliser votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protge par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis deux licences, en fonction des contributeurs : Les contributions de Clment Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies des contributions de Clment Cunin et Johann Heymes tant que cette note apparat clairement : "Ce document issu de http:// www.developpez.com est soumis la licence GNU FDL traduite en franais ici. Permission vous est donne de distribuer, modifier des copies de cette page tant que cette note apparat clairement". - Pour ce qui est des autres contributions : Copyright 2006 Developpez LLC : Tous droits rservs Developpez LLC.