FAQ Java XML - Arts Vivants en Vaucluse

Transcription

FAQ Java XML - Arts Vivants en Vaucluse
FAQ Java XML
Date de publication : 12/10/2006
Dernière mise à jour : 17/05/2009
Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de
http://www.developpez.com et de l'expérience 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 prétend pas non plus être complète. Si vous trouvez une erreur,
ou que vous souhaitez nous aider en devenant rédacteur, lisez Comment participer à
cette faq ?.
Sur ce, nous vous souhaitons une bonne lecture.
L'équipe Java
Ont contribué à cette FAQ :
bazinou - iubito - Clément Cunin - Johann Heymes - Ronan
Le Gallo - Christophe Ludet - Jean-Baptiste Bugeaud Grégory Danelon - Sébastien 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 générales (5) .........................................................................................................................................................4
Généralités (11) ......................................................................................................................................................................... 7
SAX (6) ....................................................................................................................................................................................13
DOM (11) ................................................................................................................................................................................ 20
XSLT (9) ..................................................................................................................................................................................29
XPath (12) ................................................................................................................................................................................37
-3Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Sommaire > Informations générales
Comment bien utiliser cette faq ?
Auteurs : L'équipe Java ,
Le but :
Cette faq a été conçue pour être la plus simple possible d'utilisation. Elle tente d'apporter des réponses simples et
complètes aux questions auxquelles sont confrontés tous les débutants (et les autres).
L'organisation :
Les questions sont organisées par thème, les thèmes pouvant eux-même contenir des sous-thèmes. Lorsqu'une question
porte sur plusieurs thèmes, celle-ci est insérée dans chacun des thèmes rendant la recherche plus facile.
Les réponses :
Les réponses contiennent des explications et des codes sources. Certaines sont complétées de fichier à télécharger
contenant un programme de démonstration. Ces programmes sont volontairement très simples afin qu'il soit aisé de
localiser le code intéressant. Les réponses peuvent également être complétées de liens vers d'autres réponses, vers la
documentation en ligne de Sun ou vers un autre site en rapport.
Nouveautés et mises à jour :
Lors de l'ajout ou de la modification d'une question/réponse, un indicateur est placé à coté du titre de la question.
Cet indicateur reste visible pour une durée de 15 jours afin de vous permettre de voir rapidement les modifications
apportées.
J'espère que cette faq pourra répondre à vos questions. N'hésitez 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 préférable que toutes
collaborations soient transmises aux administrateurs de la faq.
Plusieurs compétences sont actuellement recherchées pour améliorer cette faq :
Rédacteur :
Bien évidemment, toute nouvelle question/réponse 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 débusquez une... Idem pour les liens erronés.
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 présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le
reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs :
- Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la licence GNU FDL traduite
en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et
Johann Heymes tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission
vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".
- Pour ce qui est des autres contributions : Copyright © 2004 Developpez LLC : Tous droits réservés 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 intérêts. Cette page est déposée à 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 méthodes ... à toujours avoir sous la main.
Les didacticiels de Sun
La FAQ de JGuru, beaucoup plus complète que celle-ci ...
Remerciements
Auteurs : L'équipe Java ,
Un grand merci à tous ceux qui ont pris de leur temps pour la réalisation de cette FAQ.
Aux rédacteurs :
Remerciements tout d'abord à tous ceux qui ont rédigé les questions et les réponses.
Clément Cunin, Johann Heymes, Nicolas Cuny, Ronan Le Gallo, Christophe Ludet, Jean-Baptiste Bugeaud, Sebastien
Andreo, Grégory Danelon, Sébastien 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Remerciements également aux personnes qui ont relu les textes pour supprimer un maximum de fautes de français.
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 spécial à Clément Cunin, qui est à l'origine de cette FAQ, à cyberzoide pour notre logo et
ses conseils avisés et à tous les membres de l'équipe qui nous ont fourni outils et logiciels nécessaires pour la réalisation
de ce document.
-6Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Sommaire > Généralités
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 représentation et structuration de données. Voici quelques caractéristiques de
ce standard :
•
•
•
Extensible : au contraire du HTML, qui contient un jeu limité de balises, le XML permet la création de ses propres
balises.
Méta-langage : grâce à son exstensibilité, le XML est un standard tout à fait approprié pour la création 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 spécifiques sur le standard XML, en lui même, 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 composée de quatre packages. Cette API met à la disposition du développeur
trois ensembles de fonctionnalités (la modélisation, le parsing et la transformation) regroupées en quatre packages
distincts.
•
•
•
•
javax.xml.parsers : Ce package contient un ensemble d'interfaces devant être implémentées par les différents
parseurs (SAX ou DOM). Ce package fournit aussi un ensemble de factory permettant l'accès aux parseurs.
org.w3c.dom : Ce package contient l'ensemble des classes et interfaces nécessaires pour travailler avec DOM
(modélisation).
org.xml.sax : Ce package contient l'ensemble des classes et interfaces nécessaires pour travailler avec SAX
(parsing).
javax.xml.transform : Ce package contient l'ensemble des classes et interfaces nécessaires pour travailler avec
XSLT (transformation).
-7Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 fonctionnalités et principes :
•
SAX :
Simple API for XML travaille les documents XML de manière évenementielle.
C'est à dire que le parseur va lire (parcourir) le fichier ou flux XML et lever tout un ensemble d'événements lors
de la rencontre avec un élément. Les éléments pouvant être des balises (ouvrantes ou fermantes), des portions de
texte, des commentaires ou encore des instructions.
Cette API est particulièrement mise en avant pour sa rapidité de traitement. Par contre, son fonctionnement est
peut-être un peu plus complexe à apréhender 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 différence de SAX, ne va pas seulement parcourir le document XML, mais va, en
plus, en fabriquer une représentation en mémoire.
Cette représentation est un arbre, que vous pourrez facilement parcourir (cf. org.w3c.dom.Document). Cet arbre
représente 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 débuter 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 manière 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 fonctionnalités sont accessibles avec JAXP ?
Auteurs : Ioan Calapodescu ,
SAX, DOM et XSLT sont les principales fonctionnalités offertes par JAXP. Mais ce ne sont pas les seules. Voici une
liste plus détaillée des spécifications supportées 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Pour des détails 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 spécifications XML ?
lien : Quels sont les parseurs XML et processeurs XSLT utilisés par JAXP RI ?
Quels sont les rapports entre les versions de JAXP et celles des spécifications XML ?
Auteurs : Ioan Calapodescu ,
Voici les différentes versions des spécifications XML supportées par JAXP RI (Reference Implementation) 1.2 et 1.3.
Versions
JAXP RI 1.3
(présent dans le
JDK 1.5)
JAXP RI 1.2
(présent 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 connaître les versions des parseurs et processeurs utilisés par JAXP RI, regardez : Quels sont les parseurs XML
et processeurs XSLT utilisés par JAXP RI ?
lien : Quels sont les parseurs XML et processeurs XSLT utilisés par JAXP RI ?
Je n'ai pas le dernier JDK. Comment faire pour avoir accès à toutes les fonctionnalités de JAXP ?
Auteurs : Ioan Calapodescu ,
Si vous n'avez pas le dernier JDK et que vous désirez profiter de toutes les fonctionnalités de JAXP, vous pouvez
télécharger l'API séparément sur Java.NET. JAXP Reference Implementation Project : https://jaxp.dev.java.net/
N'oubliez pas que vous pouvez aussi télécharger d'autres API pour travailler avec XML. Certaines sont plus faciles,
performantes ou complètes que JAXP.
Quels sont les parseurs XML et processeurs XSLT utilisés par JAXP RI ?
Auteurs : Ioan Calapodescu ,
Voici les différents parseurs XML et processeurs XSLT utilisés 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 spécifier la variable d'environnement javax.xml.parsers.XXX, ou XXX
détermine l'implémentation qui vous intéresse. 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 démarche est la même, il suffit d'indiquer au système quelle implémentation du processeur
XSLT il doit utiliser.
Naturellement, vous pouvez utiliser directement les implémentations (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 spécifier l'implémentation à utiliser grâce aux propriétés
système.
Comment chercher une DTD dans le CLASSPATH (SAX et DOM) ?
Auteurs : bulbo ,
Cette solution utilise la spécification JAXP 1.2.
La DTD sera décrite 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 répertoire ou l'application sera lancée.
Pour SAX:
Dans le DefaultHandler redéfinir la méthode resolveEntity comme suit :
- 10 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 méthode retourne null, le parser XML utilise sa méthode de recherche par défaut pour trouver la DTD.
Ce qui fait que ce code n'empêche pas de trouver une DTD située 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 implémente l'interface EntityResolver.
Le code de la méthode resolveEntity est exactement le même que pour SAX.
Pour spécifier au parser DOM quelle méthode utiliser:
DocumentBuilder builder = ...
builder.setEntityResolver(new MonEntityResolver());
Ou trouver plus d'informations sur le format XML ?
Auteurs : Ioan Calapodescu ,
Si vous désirez plus d'informations sur le standard XML et ses applications, je vous invite à parcourir ces liens :
•
Cours et tutoriels XML
- 11 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 dédiée à XML. On peut même dire qu'il y en a beaucoup. Certaines sont très
spécialisée (sur la technologie J2EE par exemple), d'autres sont plus généralistes et reprennent/consolident/améliorent
les composantes de JAXP. Je vous laisse les découvrir par vous même :
•
•
•
•
•
•
•
JDOM : JDOM se veut une API légère, 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 dernières API, vous pouvez regarder le J2EE 1.4 Tutorial de Sun.
- 12 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 récupère un parseur (javax.xml.parsers.SAXParser) à partir d'une fabrique de parseurs
(javax.xml.parsers.SAXParserFactory).
Ce parseur parcourt le document XML grâce à un lecteur (org.xml.sax.XMLReader). Ce dernier contient plusieurs
gestionnaires (ou handlers). Ce sont ces différents gestionnaires qui sont chargés du traitement des "événements" lors
du parsing. Voici les quatre principaux types de handlers (interfaces du package org.xml.sax) :
•
•
•
•
Gestionnaire de Contenu : Le ContentHandler est chargé des événements comme le début ou la fin du document,
l'ouverture ou a fermeture de balises ou encore la lecture de caractères.
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) gère les événements relatifs aux DTD.
Gestionnaire d'entités externes : L'EntityResolver est chargé de gérer les entités externes, en fournissant une
InputSource adéquate.
Doit-on implémenter les quatre types de handlers ?
Auteurs : Ioan Calapodescu ,
Non, ce n'est pas nécessaire. Il faut utiliser la classe DefaultHandler du package org.xml.sax.helpers.
- 13 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 implémentation par défaut des quatres types de gestionnaires.
Vous avez simplement besoin d'étendre cette classe afin d'implémenter les méthodes qui vous sont utiles. Pour un
exemple, regardez : Comment parser un XML avec SAX ?.
Vous pouvez aussi regarder du côté de la classe org.xml.sax.ext.DefaultHandler2, qui propose en plus des quatre handlers
de base une implémentation par défaut de DeclHandler, EntityResolver2 et LexicalHandler. Ces trois gestionnaires sont
des extensions pour SAX2.
lien : Comment parser un XML avec SAX ?
Comment créer un parseur avec SAX ?
Auteurs : Ioan Calapodescu ,
Voici un exemple de création 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{
// création d'une fabrique de parseurs SAX
SAXParserFactory fabrique = SAXParserFactory.newInstance();
// création 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'entrée/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 exécution. Cet exemple met juste en
évidence l'obtention du parseur et les types d'exception susceptibles d'être levées. Pour un exemple d'implémentation
de DefaultHandler regardez : Comment parser un XML avec SAX ?.
Voici quelques propriétés du parseur (SAXParser) que vous pouvez spécifier à la fabrique (SAXParserFactory) :
•
setValidating(boolean) : indique si les parseurs produits par la fabrique doivent valider la DTD. Par défaut, cette
valeur est false.
- 14 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
•
•
•
setSchema(Schema) : indique que les parseurs produits par la fabrique doivent valider le document XML selon
un schéma XML W3C.
setFeature(String, boolean) : permet d'indiquer une propriété particulière pour les parseurs produits par la
fabrique. Pour une liste de ces propriétés, 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 profondément votre parseur avec la méthode 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) téléchargez 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 représente 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 représenter une entrée dans cet annuaire :
Personne
public class Personne{
private int id;
private String nom, prenom, adresse;
public Personne(){}
public
public
public
public
int getId(){return id;}
String getNom(){return nom;}
String getPrenom(){return prenom;}
String getAdresse(){return adresse;}
public
public
public
public
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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 récupérer une List
de Personne.
PersonneHandler
public class PersonneHandler extends DefaultHandler{
//résultats 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 récupérer les données
private StringBuffer buffer;
// simple constructeur
public PersonneHandler(){
super();
}
//détection 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.");
}
}
}
//détection 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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.");
}
}
//détection de caractères
public void characters(char[] ch,int start, int length)
throws SAXException{
String lecture = new String(ch,start,length);
if(buffer != null) buffer.append(lecture);
}
//début du parsing
public void startDocument() throws SAXException {
System.out.println("Début 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 éléments 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 avancées que SAX pour lier des fichiers XML et des Object Java. L'exemple ci-dessus sert juste
de démonstration.
PersonneHandler.zip
Comment gérer 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'obéit pas à la DTD ou au schéma qu'on lui a imposé.
- 17 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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
même. Par exemple, des balises mal fermées ou se chevauchant.
Par contre, au niveau du parseur SAX, il existe trois niveaux d'erreurs. Ces trois niveaux d'erreurs sont représentées
au niveau du Gestionnaire d'Erreurs (ErrorHandler) :
•
•
•
Erreur fatale (fatalError(SAXParseException exception) throws SAXException) : Cette erreur ne peut être
récupérée. C'est le cas par exemple pour un document mal formé. Après ce type d'erreur, le parseur SAX arrête
son travail.
Erreur (error(SAXParseException exception) throws SAXException) : Cette erreur peut être récupérée, 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 imposée par la DTD ou le schéma.
Warning (warning(SAXParseException exception) throws SAXException) : C'est un simple avertissement. Après
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 défaut (cf.
DefautHandler), seules les erreurs fatales sont "traitées".
Voici un exemple d'implémentation de ErrorHandler. Cet exemple détaille sur la sortie standard les erreurs simples et
warnings et lève 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Pour un exemple d'utilisation, téléchargez 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 Sébatien Méric : 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 :
Cours Java - Lecture d'un flux XML via SAX
lien :
J2EE 1.4 Tutorial
- 19 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 récupère 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 représentation, sous forme d'arbre "d'objets", des données contenues dans le XML.
DOM reste une API de "bas niveau". Si vous voulez travailler de manière plus orientée objet, avec des arbres XML,
regardez du côté 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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{
// création d'une fabrique de documents
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
// création 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'entrée/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
créer un parseur avec SAX ?.
Pour voir comment parcourir votre document, regardez : Comment parcourir l'arborescence d'un DOM ?
Vous pouvez télécharger un exemple simple (affichage sur la sortie standard du DOM) ci-dessous.
lien : Comment parcourir l'arborescence d'un DOM ?
ExempleDOM.zip
Comment gérer les erreurs durant la création d'un DOM ?
Auteurs : Ioan Calapodescu ,
Tout comme pour SAX, on peut gérer les erreurs lors de la construction d'un Document grâce à 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 :
// création d'une fabrique de documents
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
// création et configuration du constructeur de documents
DocumentBuilder constructeur = fabrique.newDocumentBuilder();
constructeurs.setErrorHandler(new GestionnaireDErreurs());
Document document = constructeur.parse(new File("ExempleDOM.xml"));
lien : Comment gérer les erreurs durant le parsing ?
Quelles informations peut on récupérer 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 récupérant, à partir d'un Document, des informations générales, 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 détail des méthodes printDoctype et printDOMConfiguration, téléchargez le fichier ci-dessous.
InfosDOM.zip
Quels sont les différents types de nodes ?
Auteurs : Ioan Calapodescu ,
Avant de commencer à parcourir un arbre DOM et à en extraire les données, il est nécessaire de bien comprendre
sa structure. Il est notamment nécessaire de bien faire la distinction entre les différents 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
élément, une portion CDATA ou encore une instruction. Pour connaître le type d'un Node utilisez la méthode
getNodeType().
Element (org.w3c.dom.Element) : L'interface Element définit un élément au sens XML (XHTML ou HTML). Un
élément est constitué d'un tag, d'attributs et d'un contenu (autres nodes et éléments).
Voici les différents types de nodes et le résultat des méthodes capables d'en découvrir le contenu.
- 23 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Interface
(org.w3c.dom)
Attr
getNodeType() getNodeName() getNodeValue()
(short)
(String)
(String)
ATTRIBUTE_NODE
Le nom de
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
"#documentnull
fragment"
DocumentType DOCUMENT_TYPE_NODE
Le nom du type. null
Element
ELEMENT_NODELe nom du tag. null
Entity
ENTITY_NODE Le nom de
null
l'entité.
EntityReference ENTITY_REFERENCE_NODE
Le nom
null
de l'entité
réferencée.
Notation
NOTATION_NODE
Le nom de la
null
notation.
ProcessingInstruction
PROCESSING_INSTRUCTION_NODE
La cible de
Les données de
l'instruction.
l'instruction.
Text
TEXT_NODE
"#text"
Le texte en luimême.
getAttributes()
(NamedNodeMap)
null
null
null
null
null
null
Les attributs de
l'élément.
null
null
null
null
null
Si vous voulez récupérer le texte contenu dans un node (et dans l'ensemble de ses enfants), utilisez la méthode
getTextContent().
Pour éviter toute ambiguité lors de l'utilisation d'Element, préférez les méthodes spécifiques de cette interface (cf.
Comment accèder au contenu et aux attributs d'un Element ?).
lien : Comment parcourir l'arborescence d'un DOM ?
lien : Comment accèder au contenu et aux attributs d'un Element ?
Comment parcourir l'arborescence d'un DOM ?
Auteurs : Ioan Calapodescu ,
La première chose à faire pour commencer à parcourir votre arbre DOM est de récupérer la racine.
Document document = ...;
Element racine = document.getDocumentElement();
A partir de cette racine, vous pouvez parcourir l'enseble du document. Voici les méthodes à utiliser :
Méthodes 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
•
•
•
getNextSibling : retourne la prochaine occurrence du Node.
getParentNode : retourne le noeud parent du Node.
getPreviousSibling: retourne la précédente occurrence du Node.
Méthodes de l'interface Element
•
getElementsByTagName : retourne une NodeList contenant les éléments enfants dont le tag correspond au nom
passé en paramètre (* pour renvoyer tous les éléments).
getElementsByTagNameNS : même chose que getElementByTagName, avec prise en compte des namespace.
•
Comment accèder au contenu et aux attributs d'un Element ?
Auteurs : Ioan Calapodescu ,
Pour accèder au contenu et aux attributs d'un Element, on peut utiliser les méthodes getTextContent et
getAttributesByTagName.
Voici un exemple, dans lequel on extrait d'un XHTML les liens et leurs propriétés :
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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Vous pouvez télécharger cet exemple ci-dessous.
Pour avoir plus d'informations sur un Element (ou un attribut) définit par un schéma, utilisez la méthode
getSchemaTypeInfo().
LiensXHTML.zip
Comment connaitre le nombre d'enfants d'un Element ?
Auteurs : Ioan Calapodescu ,
Cela dépend de ce que vous entendez par "enfant". Comme toujours, il faut bien faire la différence 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 méritait d'être souligné car l'erreur (la confusion entre Node et Element) est souvent commise.
Ces méthodes sont relativement limitées. Pour des opérations plus complexes, regardez du côté 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 éléments) ?
Auteurs : Ioan Calapodescu ,
L'API DOM fournit avec les classes Document, Node et ses dérivées (Element, par exemple) tout un ensemble de
méthodes permettant la modification du document. Voici, en résumé, les méthodes disponibles pour Document, Node
et Element :
Méthodes de Document
•
•
•
•
•
adoptNode(Node source) : importe le noeud passé en paramètre. Si ce noeud appartient déjà à une arborescence,
il en est supprimé. Le méthode retourne le noeud adopté ou null si l'opération é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 résultat.
renameNode(Node n, String namespaceURI, String qualifiedName) : renomme le noeud passé en paramètre et
retourne ce dernier. Attention, seuls les nodes de type item et Attr peuvent être ainsi renommés.
setDocumentURI(String documentURI) : remplace l'URI du document.
setXmlStandalone(boolean xmlStandalone) : définit si le XML est "standalone" ou non.
- 26 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
•
•
setXmlVersion(String xmlVersion) : définit la version du XML ("1.0" par défaut).
normalizeDocument() : cette méthode valide les modifications apportées au DOM. Voir aussi la méthode
normalize() de l'interface Node.
Méthodes de Node
•
•
•
•
•
•
•
appendChild(Node newChild) : ajoute le noeud passé en paramètre à la fin des autres enfants du node. cette
méthode retourne le noeud ajouté.
insertBefore(Node newChild, Node refChild) : insère "newChild" avant "refChild" et retourne "newChild".
removeChild(Node oldChild) : supprimme le noeud passé en paramètre 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 différents
types de nodes ? pour connaître les valeurs possibles.
setPrefix(String prefix) : met "prefix" comme nouveau préfixe du noeud.
setTextContent(String textContent) : met "textContent" comme contenu du noeud. Attention, ceci supprimme
l'ensemble des noeuds enfants.
Méthodes de Element
•
•
•
removeAttribute(String name) : supprimme l'attribut nommé.
setAttribute(String name, String value) : crée un nouvel attribut (ou modifie la valeur de l'attribut si il existe déjà).
setIdAttribute(String name, boolean isId) : crée un nouvel attribut de type ID (ou modifie la valeur de l'attribut
si il existe déjà).
Ces trois méthodes ont toutes des variantes. Les méthodes XXXNode permettent notamment de retourner l'instance
de Attr modifiée ou supprimmée.
Pour un exemple d'utilisation de quelques une de ces méthodes, regardez Comment créer un DOM de toutes pièces?.
Ces méthodes ne modifient que l'arbre en mémoire. Pour modifier la source XML, vous devez utiliser XSLT : Comment
créer ou modifier un fichier XML avec DOM et XSLT ?.
lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
lien : Comment créer un DOM de toutes pièces?
lien : Quels sont les différents types de nodes ?
Comment créer un DOM de toutes pièces?
Auteurs : Ioan Calapodescu ,
La classe DocumentBuilder permet de créer une nouvelle instance de Document grâce à la méthode newDocument().
Pour le reste, Document fournit un ensemble de méthodes createXXX, qui vont vous permettre de créer des nodes,
éléments, commentaires et attributs.
Voici un exemple :
// Création d'un nouveau DOM
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
DocumentBuilder constructeur = fabrique.newDocumentBuilder();
Document document = constructeur.newDocument();
// Propriétés du DOM
document.setXmlVersion("1.0");
- 27 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
document.setXmlStandalone(true);
// Création 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 prénom");
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 prénom</prenom>
<adresse>une adresse</adresse>
</personne>
</annuaire>
Pour sauvegarder ce DOM sous forme de XML, vous devrez utiliser XSLT (cf. Comment créer ou modifier un fichier
XML avec DOM et XSLT ?). Vous pouvez télécharger une exemple ci-dessous.
lien : Comment créer 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 récupérer 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 résultat
(javax.xml.transform.Resultat). Par défaut, si aucune véritable transformation n'est demandée, le transformeur va
simplement copier la source dans le résultat.
La source et le résultat peuvent être respectivement un parseur SAX, un DOM, une InputSource et un ensebble
d'évènements SAX, un DOM ou une OutputSource.
Pour une configuration pratique du transformeur, regardez : Comment créer et configurer un Transformer (pour SAX
et DOM) ?
Pour des exemples, regardez : Comment créer ou modifier un fichier XML avec DOM et XSLT ? et Comment créer
ou modifier un fichier XML avec SAX et XSLT ?
lien : Comment créer et configurer un Transformer (pour SAX et DOM) ?
lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
- 29 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
lien : Comment créer ou modifier un fichier XML avec SAX et XSLT ?
Comment créer et configurer un Transformer (pour SAX et DOM) ?
Auteurs : Ioan Calapodescu ,
Voici un exemple de création et de configuration d'un Transformer :
// création de la fabrique
TransformerFactory fabrique = TransformerFactory.newInstance();
// récupération du transformeur
Transformer transformer = fabrique.newTransformer();
/**
* pour définir une feuille de style, vous pouvez utiliser une Source comme paramètre
* 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 gérer les erreurs durant la transformation ? .
Pour connaître toutes les clefs disponibles pour le Transformer, regardez la classe javax.xml.transform.OutputKeys.
lien : Comment gérer les erreurs durant la transformation ?
Que sont les Templates crées 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 utilisée par plusieurs Threads sans risque).
La création et configuration d'une Template se font de la même manière que pour un Transformer. Par exemple :
// création de la fabrique
TransformerFactory fabrique = TransformerFactory.newInstance();
// récupération de Templates
Templates template = fabrique.newTemplates();
/**
* pour définir une feuille de style, vous pouvez utiliser une Source comme paramètre
* 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
lien : Comment créer et configurer un Transformer (pour SAX et DOM) ?
Comment gérer les erreurs durant la transformation ?
Auteurs : Ioan Calapodescu ,
La gestion des erreurs se fait de la même manière que pour SAX/DOM et les ErrorHandler. On peut gérer 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 gérer les erreurs durant le parsing ?
lien : Comment gérer les erreurs durant la création d'un DOM ?
Comment créer ou modifier un fichier XML avec DOM et XSLT ?
Auteurs : Ioan Calapodescu ,
Voici une méthode permettant de créer un fichier XML à partir d'un DOM :
public static void transformerXml(Document document, String fichier) {
try {
// Création de la source DOM
Source source = new DOMSource(document);
// Création 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 télécharger les sources d'un exemple complet ci-dessous.
lien : Comment créer ou modifier un fichier XML avec SAX et XSLT ?
lien : Comment créer un fichier HTML à partir d'un XML ?
lien : Comment créer un fichier PDF à partir d'un XML ?
CreationDOM.zip
Comment créer ou modifier un fichier XML avec SAX et XSLT ?
Auteurs : Ioan Calapodescu ,
Pour créer un fichier XML avec SAX et XSLT, il nous faut créer 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 nécessaires à sa
création de la source :
•
•
•
•
Création du bean : Personne définit un élément de l'annuaire..
Création d'une InputSource : AnnuaireSource définit la List des personnes de l'annuaire.
Création d'un XMLReader : AnnuaireReader est capable de "parser" la source pour lever des évènements SAX.
Création de la SAXSource, à partir de l'InputSource et du Reader.
Après 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 méthodes 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
AnnuaireReader
private AttributesImpl atts = new AttributesImpl();
//méthode qui vont être utilisées 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 méthodes à implémenter
}
Exemple d'utilisation :
// Création de l'annuaire
List<Personne> annuaire = new ArrayList<Personne>();
// ...
//remplissage de l'annuaire
// Création de la source DOM
XMLReader annuaireReader = new AnnuaireReader();
InputSource annuaireSource = new AnnuaireSource(annuaire);
- 33 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Source source = new SAXSource(annuaireReader, annuaireSource);
// Création 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);
Téléchargez le code source complet ci-dessous.
lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
lien : Comment créer un fichier HTML à partir d'un XML ?
lien : Comment créer un fichier PDF à partir d'un XML ?
SaxXSLT.zip
Comment créer un fichier HTML à partir d'un XML ?
Auteurs : Ioan Calapodescu ,
La création 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{
// Création 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);
// Création 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 télécharger ci-dessous un exemple simple avec xml, xsl et classe de test.
lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
- 34 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
lien : Comment créer un fichier PDF à partir d'un XML ?
CreationHTML.zip
Comment créer un fichier PDF à partir d'un XML ?
Auteurs : Ioan Calapodescu ,
L'API standard ne fournit pas de mécanisme pour transformer un XML en PDF. Par contre, une très 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{
// création du résultat (pdf)
Driver driver = new Driver();
driver.setRenderer(Driver.RENDER_PDF);
driver.setOutputStream(new java.io.FileOutputStream(pdf));
Result resultat = new SAXResult(driver.getContentHandler());
// récupération de la source xml
Source source = new StreamSource(xml);
// création 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 télécharger un exemple complet avec xml et xsl ci dessous. Verifiez bien que la librairie FOP (et ses
dépendances) se trouve bien dans votre classpath avant de compiler/exécuter l'exemple.
lien : Comment créer un fichier HTML à partir d'un XML ?
CreationPDF.zip
Comment enchaîner les transformations XSLT ?
Auteurs : Ioan Calapodescu ,
Vous pouvez très bien vouloir enchaîner les transformations XSLT. Par enchaîner, on entend appliquer plusieurs
transformations successives à un document XML. Chaque résultat 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Source image = J2EE 1.4 Tutorial
Voici une méthode prenant en arguments un fichier XML, deux feuilles de style xsl (les transformations à enchaîner)
et un fichier html de sortie.
public static void transformer(File xml, File xsl1, File xsl2, File html) throws Exception{
// Création du reader initial
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader reader = spf.newSAXParser().getXMLReader();
// Création 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);
// Création de la source : c'est le dernier filtre de la chaîne
// C'est lui qui indiquera au transformer quelles transformations à faire "avant"
// Le résultat est le fichier HTML
SAXSource source = new SAXSource(filtre2, new InputSource(new FileInputStream(xml)));
StreamResult resultat = new StreamResult(new FileOutputStream(html));
//Transformation en chaîne
Transformer transformer = stf.newTransformer();
transformer.transform(source, resultat);
}
Vous pouvez télécharger un exemple complet d'utilisation ci-dessous.
ChaineXSLT.zip
- 36 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 "sélection" de noeuds d'un
document XML. Cette "sélection" se fait grâce à un système d'adressage que l'on pourrait comparer aux URL. En
plus de cela, XPath fournit un ensemble de fonctions sur les chaînes de caractères ou encore des fonctions permettant
d'effectuer des tests.
XPath peut être utilisé en combinaison avec XSLT et XPointer. Pour découvrir toutes les possibilités de ce langage, vous
pouvez regarder la spécification du W3C à cette adresse : http://www.w3.org/TR/xpath.
Nous ne nous attarderons pas sur les complexités de ce langage. De plus, la spécification n'étant pas toujours évidente
à décoder vous pouvez regarder "Où trouver des informations et cours sur le langage XPath lui-même ?" pour de plus
amples informations.
Cette partie de la FAQ se contentera de vous fournir les bases nécessaires à 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 antérieurs au 5.0, vous pouvez suivre ces liens :
•
•
Je n'ai pas le dernier JDK. Comment faire pour avoir accès à toutes les fonctionnalités 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-même ?
lien : Je n'ai pas le dernier JDK. Comment faire pour avoir accès à toutes les fonctionnalités 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 schéma simplifié du fonctionnement du package javax.xml.xpath :
- 37 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Le principe est simple. On commence par récupérer 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 (grâce à sa méthode
evaluate()) un Object qui peut correspondre à un NodeSet, un Node, un String, un Number ou un Boolean.
Pour voir le code exécutant ces opérations regardez : Comment obtenir une XPathExpression ?
Attention : NODE, NUMBER, STRING, etc. sont des instances de QName définies 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 méthode evaluate ?.
lien : Comment obtenir une XPathExpression ?
lien : Que fait exactement la méthode evaluate ?
Comment obtenir une XPathExpression ?
Auteurs : Ioan Calapodescu ,
Voici deux méthodes statiques montrant comment créer 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{
//création du XPath
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
//évaluation de l'expression XPath
- 38 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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{
//création de la source
InputSource source = new InputSource(new FileInputStream(fichier));
//création 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 supplémentaires :
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 méthode evaluate().
Ainsi, on pourrait remplacer le code de la première méthode par :
XPath xpath = XPathFactory.newInstance().newXPath();
Object resultat = xpath.evaluate(expression,document,retour);
Pour connaître tous les arguments et types de retour possibles pour la méthode evaluate() regardez : Que fait exactement
la méthode evaluate ?
Vous pouvez télécharger un exemple simple d'utilisation de ces deux méthodes ci-dessous.
lien : Que fait exactement la méthode evaluate ?
ExempleXPath.zip
Que fait exactement la méthode evaluate ?
Auteurs : Ioan Calapodescu ,
Que ce soit dans la classe XPath ou dans XPathExpression, la méthode evaluate() a quatre variantes. Pour toutes ces
méthodes, l'argument de type String nommé expression correspond à l'expression XPath à évaluer.
- 39 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Arguments
String expression, Object item,
QName returnType
Object
Retour
String expression, Object item
String
String expression, InputSource
source, QName returnType
Object
String expression, InputSource
source
String
Description
L'argument item correspond
à un élément 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
levée sinon). Cet argument définit
simplement le type de l'Object
retourné par la méthode (voir
tableau ci-dessous).
Cette méthode a le même
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
levée sinon). Cet argument définit
simplement le type de l'Object
retourné par la méthode (voir
tableau ci-dessous).
Cette méthode a le même
comportement que
evaluate(expression, source,
returnType) avec returnType égal à
XPathConstants.STRING.
Les types de retour correspondent à la spécification 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 méthode evaluate :
QName
XPathConstants.NODE
Type de retour
org.w3c.dom.Node
XPathConstants.NODESET
org.w3c.dom.NodeList
Description
Quand un Node est requis comme
type de retour, la méthode
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 méthode
- 40 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 sélectionnés par l'expression
XPath.
Quand un String est requis comme
type de retour la méthode evaluate()
retourne le contenu du ou des noeuds
satisfaisant l'expression XPath
(enfants compris).
Quand un Boolean est requis comme
type de retour la méthode evaluate()
retourne Boolean.TRUE si au
moins un noeud est sélectionné,
Boolean.FALSE sinon.
Quand un Number est requis comme
type de retour la méthode evaluate()
essaye de transformer le contenu du
noeud sélectionné en Double.
Pour un exemple pratique d'utilisation de chacune de ces méthodes regardez les liens ci-dessous.
•
•
•
•
•
Comment récupérer un ensemble de noeuds avec XPath ?
Comment récupérer un Node avec XPath ?
Comment récupérer un booléen à partir d'une expression XPath ?
Comment récupérer une chaîne de caractères avec XPath ?
Comment récupérer un nombre à partir d'une expression XPath ?
lien : Comment récupérer un ensemble de noeuds avec XPath ?
lien : Comment récupérer un Node avec XPath ?
lien : Comment récupérer un booléen à partir d'une expression XPath ?
lien : Comment récupérer une chaîne de caractères avec XPath ?
lien : Comment récupérer 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 méthode 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 récupérer une chaîne de caractères avec XPath ?
lien : Comment récupérer une chaîne de caractères avec XPath ?
Comment récupérer un ensemble de noeuds avec XPath ?
Auteurs : Ioan Calapodescu ,
Voici un exemple permettant de récupérer un NodeSet (org.w3c.dom.NodeList) à partir d'une expression XPath.
public static NodeList evaluer(InputStream stream, String expression){
NodeList liste = null;
try{
//création de la source
InputSource source = new InputSource(stream);
//création 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 méthode pour, par exemple, récupérer l'ensemble des titres des articles publiés (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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
Vous pouvez télécharger cet exemple ci-dessous.
NodeSetXPath.java
Comment récupérer un Node avec XPath ?
Auteurs : Ioan Calapodescu ,
Voici une méthode permettant de récupérer un Node (package org.w3c.dom) avec XPath.
public static Node evaluer(InputStream stream, String expression){
Node node = null;
try{
//création de la source
InputSource source = new InputSource(stream);
//création 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 méthode, par exemple pour récupérer 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 télécharger l'exemple ci-dessous.
NodeXPath.java
Comment récupérer un booléen à partir d'une expression XPath ?
Auteurs : Ioan Calapodescu ,
Voici une méthode permettant de récupérer un booléen (java.lang.Boolean) avec XPath.
public static Boolean evaluer(InputStream stream, String expression){
Boolean b = null;
try{
//création de la source
InputSource source = new InputSource(stream);
//création du XPath
- 43 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 méthode peut être utilisée, par exemple, pour vérifier 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 téléchargeable ci-dessous.
BooleanXPath.java
Comment récupérer une chaîne de caractères avec XPath ?
Auteurs : Ioan Calapodescu ,
Voici une méthode permettant de récupérer une chaîne de caractères (java.lang.String) à partir de XPath.
public static String evaluer(InputStream stream, String expression,
NamespaceContext namespace){
String string = null;
try{
//création de la source
InputSource source = new InputSource(stream);
//création 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 présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.
FAQ Java XML
}
On peut utiliser cette méthode pour, par exemple, récupérer 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 téléchargeable ci-dessous.
StringXPath.java
Comment récupérer un nombre à partir d'une expression XPath ?
Auteurs : Ioan Calapodescu ,
Voici une méthode permettant de récupérer un nombre (java.lang.Double) à partir de XPath.
public static Double evaluer(InputStream stream, String expression){
Double number = null;
try{
//création de la source
InputSource source = new InputSource(stream);
//création du XPath
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
- 45 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés 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 méthode peut être utilisée pour, par exemple, compter le nombre de news concernant J2EE et publiées (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 téléchargeable 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 antérieures de Java, il faut regarder du côté 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 télécharger JAXP de manière indépendante : https://jaxp.dev.java.net/
Où trouver des informations et cours sur le langage XPath lui-même ?
Auteurs : Ioan Calapodescu ,
Pour plus d'informations sur XPath lui-même vous pouvez suivre ces liens :
•
•
•
•
•
Rubrique XML de developpez.com
Tutoriel XPath
Forum d'entraide XML, XSL, SOAP, etc.
Spécification XPath version 1.0
Spécification XPath version 2.0 (non compatible avec le JDK standard, mais avec d'autres librairies)
- 46 Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page
tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2006 Developpez LLC : Tous droits réservés Developpez LLC.