Niveau : | Intermédiaire |
L'utilisation de Java avec XML est facilitée par le fait qu'ils ont plusieurs points communs :
Ce chapitre contient plusieurs sections :
XML est l'acronyme de «eXtensible Markup Language».
XML permet d'échanger des données entres applications hétérogènes car il peut modéliser et stocker des données de façon portable.
XML est extensible dans la mesure où il n'utilise pas de tags prédéfinis comme HTML et il permet de définir de nouvelles balises : c'est un métalangage.
Le format HTML est utilisé pour formater et afficher les données qu'il contient : il est destiné à structurer, formater et échanger des documents d'une façon aussi standard que possible.
XML est utilisé pour modéliser et stocker des données. Il ne permet pas à lui seul d'afficher les données qu'il contient.
Pourtant, XML et HTML sont tous les deux des dérivés d'un langage nommé SGML (Standard Generalized Markup Language). La création d'XML est liée à la complexité de SGML. D'ailleurs, un fichier XML avec sa DTD correspondante peut être traité par un processeur SGML.
XML et Java ont en commun la portabilité réalisée grâce à une indépendance vis-à-vis du système et de son environnement.
Un certain nombre de règles doivent être respectées pour définir un document XML valide et «bien formé». Pour pouvoir être analysé, un document XML doit avoir une syntaxe correcte. Les principales règles sont :
Les balises d'un document XML sont libres. Pour pouvoir valider le document, il faut définir un document nommé DTD qui est optionnel. Sans sa présence, le document ne peut être validé : on peut simplement vérifier que la syntaxe du document est correcte.
Une DTD est un document qui contient la grammaire définissant le document XML. Elle précise notamment les balises autorisées et comment elles s'imbriquent.
La DTD peut être incluse dans l'en-tête du document XML ou être mise dans un fichier indépendant. Dans ce cas, la directive < !DOCTYPE> dans le document XML permet de préciser le fichier qui contient la DTD.
Il est possible d'utiliser une DTD publique ou de définir sa propre DTD si aucune ne correspond à ses besoins.
Pour être valide, un document XML doit avoir une syntaxe correcte et correspondre à la DTD.
Il existe plusieurs types de parseurs. Les plus répandus sont ceux qui utilisent un arbre pour représenter et exploiter le document et ceux qui utilisent des événements. Le parseur peut en plus permettre de valider le document XML.
Ceux qui utilisent un arbre permettent de le parcourir pour obtenir les données et modifier le document.
Ceux qui utilisent des événements associent à des événements particuliers des méthodes pour traiter le document.
SAX (Simple API for XML) est une API libre créée par David Megginson qui utilise les événements pour analyser et exploiter les documents au format XML.
Les parseurs qui produisent des objets composant une arborescence pour représenter le document XML utilisent le modèle DOM (Document Object Model) défini par les recommandations du W3C.
Le choix d'utiliser SAX ou DOM doit tenir compte de leurs points forts et de leurs faiblesses :
|
les avantages |
les inconvénients |
DOM |
parcours libre de l'arbre possibilité de modifier la structure et le contenu de l'arbre |
gourmand en mémoire doit traiter tout le document avant d'exploiter les résultats |
SAX |
peu gourmand en ressources mémoire rapide principes faciles à mettre en oeuvre permet de ne traiter que les données utiles |
traite les données séquentiellement un peu plus difficile à programmer, il est souvent nécessaire de sauvegarder des informations pour les traiter |
SAX et DOM ne fournissent que des définitions : ils ne fournissent pas d'implémentation utilisable. L'implémentation est laissée aux différents éditeurs qui fournissent un parseur compatible avec SAX et/ou DOM. L'avantage d'utiliser l'un d'eux est que le code utilisé sera compatible avec les autres : le code nécessaire à l'instanciation du parseur est cependant spécifique à chaque fournisseur.
IBM fournit gratuitement un parseur XML : xml4j. Il est téléchargeable à l'adresse suivante : http://www.alphaworks.ibm.com/tech/xml4j
Le groupe Apache développe Xerces à partir de xml4j : il est possible de télécharger la dernière version à l'URL http://xml.apache.org
Sun a développé un projet dénommé Project X. Ce projet a été repris par le groupe Apache sous le nom de Crimson.
Ces trois projets apportent pour la plupart les mêmes fonctionnalités : ils se distinguent sur des points mineurs : performance, rapidité, facilité d'utilisation etc. ... Ces fonctionnalités évoluent très vite avec les versions de ces parseurs qui se succèdent très rapidement.
Pour les utiliser, il suffit de décompresser le fichier et d'ajouter les fichiers .jar dans la variable définissant le CLASSPATH.
Il existe plusieurs autres parseurs que l'on peut télécharger sur le web.
Il existe plusieurs façons de générer des données au format XML :
Exemple : |
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
out.println("<?xml version=\"1.0\"?>");
out.println("<BIBLIOTHEQUE>");
out.println(" <LIVRE>");
out.println(" <TITRE>titre livre 1</TITRE>");
out.println(" <AUTEUR>auteur 1</AUTEUR>");
out.println(" <EDITEUR>editeur 1</EDITEUR>");
out.println(" </LIVRE>");
out.println(" <LIVRE>");
out.println(" <TITRE>titre livre 2</TITRE>" );
out.println(" <AUTEUR>auteur 2</AUTEUR>");
out.println(" <EDITEUR>editeur 2</EDITEUR>" );
out.println(" </LIVRE>");
out.println(" <LIVRE>");
out.println(" <TITRE>titre livre 3</TITRE>");
out.println(" <AUTEUR>auteur 3</AUTEUR>");
out.println(" <EDITEUR>editeur 3</EDITEUR>");
out.println(" </LIVRE>");
out.println("</BIBLIOTHEQUE>");
}
}
|
La suite de cette section sera développée dans une version future de ce document
|
JAXP est une API développée par Sun qui ne fournit pas une nouvelle méthode pour parser un document XML mais propose une interface commune pour appeler et paramétrer un parseur de façon indépendante de tout fournisseur et normaliser la source XML à traiter. En utilisant un code qui respecte JAXP, il est possible d'utiliser n'importe quel parseur qui répond à cette API tel que Crimson le parseur de Sun ou Xerces le parseur du groupe Apache.
JAXP supporte pour le moment les parseurs de type SAX et DOM.
JAXP 1.0
|
JAXP 1.1
|
|
SAX |
type 1
|
type 2
|
DOM |
niveau 1
|
niveau 2
|
Par exemple, sans utiliser JAXP, il existe deux méthodes pour instancier un parseur de type SAX :
Ces deux possibilités nécessitent une recompilation d'une partie du code lors du changement du parseur.
JAXP propose de fournir le nom de la classe du parseur en paramètre à la JVM sous la forme d'une propriété système. Il n'est ainsi plus nécessaire de procéder à une recompilation car il suffit de mettre à jour cette propriété et le CLASSPATH pour qu'il référence les classes du nouveau parseur.
Le parseur de Sun et les principaux parseurs XML en Java implémentent cette API et il est très probable que tous les autres fournisseurs suivent cet exemple.
JAXP version 1.1 contient une documentation au format javadoc, des exemples et trois fichiers jar :
L'API JAXP est fournie avec une implémentation de référence de deux parseurs (un de type SAX et un de type DOM) dans le package org.apache.crimson et ses sous-packages.
JAXP se compose de plusieurs packages :
JAXP définit deux exceptions particulières :
L'API JAXP fournit la classe abstraite SAXParserFactory qui propose une méthode statique pour récupérer une instance d'un parseur de type SAX. Une classe fille instanciable de la classe SAXParserFactory est fournie par l'implémentation.
La propriété système javax.xml.parsers.SAXParserFActory permet de préciser cette classe fille qui hérite de la classe SAXParserFactory et qui sera instanciée.
Remarque : cette classe n'est pas thread safe.
La méthode statique newInstance() permet d'obtenir une instance de la classe SAXParserFactory et peut lever une exception de type FactoryConfigurationError.
Avant d'obtenir une instance du parseur, il est possible de fournir quelques paramètres à la Factory pour lui permettre de le configurer.
La méthode newSAXParser() permet d'obtenir une instance du parseur de type SAXParser : peut lever une exception de type ParserConfigurationException.
Les principales méthodes sont :
Méthode | Rôle |
boolean isNamespaceAware() | indique si la factory est configurée pour instancier des parseurs qui prennent en charge les espaces de noms |
boolean isValidating() | indique si la factory est configurée pour instancier des parseurs qui valident le document XML lors de son traitement |
static SAXParserFactory newInstance() | permet d'obtenir une instance de la factory |
SAXParser newSAXParser() | permet d'obtenir une nouvelle instance du parseur de type SAX configuré avec les options fournies à la factory |
setNamespaceAware(boolean) | configure la factory pour instancier un parseur qui prend en charge les espaces de noms ou non selon le paramètre fourni |
setValidating(boolean) | configure la factory pour instancier un parseur qui valide le document XML lors de son traitement ou non selon le paramètre fourni |
Exemple : |
SAXParserFActory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File(args[0), new handler());
Jaxen est un moteur Xpath qui permet de retrouver des informations dans un document XML de type dom4j ou Jdom.
C'est un projet open source qui a été intégré dans dom4j pour permettre le support de Xpath dans ce framework.