IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Développons en Java v 2.20   Copyright (C) 1999-2021 Jean-Michel DOUDOUX.   
[ Précédent ] [ Sommaire ] [ Suivant ] [ Télécharger ]      [ Accueil ] [ Commentez ]


 

42. Java et XML

 

chapitre 4 2

 

Niveau : niveau 3 Intermédiaire 

 

L'utilisation de Java avec XML est facilitée par le fait qu'ils ont plusieurs points communs :

  • indépendance de toute plate-forme
  • conçus pour être utilisés sur un réseau
  • prise en charge de la norme Unicode

Ce chapitre contient plusieurs sections :

 

42.1. La présentation de XML

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.

 

42.2. Les règles pour formater un document XML

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 :

  • le document doit contenir au moins une balise
  • chaque balise d'ouverture (exemple <tag>) doit posséder une balise de fermeture (exemple </tag>). Si le tag est vide, c'est à dire qu'il ne possède aucune données (exemple <tag></tag>), un tag abrégé peut être utilisé (exemple correspondant : <tag/>)
  • les balises ne peuvent pas être intercalées (exemple <liste><element></liste></element> n'est pas autorisé)
  • toutes les balises du document doivent obligatoirement être contenues dans l'espace défini par une balise unique nommée élément racine
  • les valeurs des attributs doivent obligatoirement être encadrées avec des quotes simples ou doubles
  • les balises sont sensibles à la casse
  • Les balises peuvent contenir des attributs même les balises vides
  • les données incluses entre les balises ne doivent pas contenir de caractères < et & : il faut utiliser respectivement &lt ; et &amp ;
  • La première ligne du document devrait normalement correspondre à la déclaration de document XML : le prologue.

 

42.3. La DTD (Document Type Definition)

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.

 

42.4. Les parseurs

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.

 

42.5. La génération de données au format XML

Il existe plusieurs façons de générer des données au format XML :

  • coder cette génération à la main en écrivant dans un flux
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>");
  }
}

  • utiliser JDOM pour construire le document et le sauvegarder
  • utiliser la classe javax.xml.stream.XmlStreamWriter
  • utiliser la classe java.beans.XMLEncoder pour sérialiser un bean
  • utiliser une API open source comme XStream

 

en construction
La suite de cette section sera développée dans une version future de ce document

 

42.6. JAXP : Java API for XML Parsing

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 :

  • créer une instance de la classe de type SaxParser
  • utiliser la classe ParserFactory qui demande en paramètre le nom de la classe de type SaxParser

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.

 

42.6.1. JAXP 1.1

JAXP version 1.1 contient une documentation au format javadoc, des exemples et trois fichiers jar :

  • jaxp.jar : contient l'API JAXP
  • crimson.jar : contient le parseur de Sun
  • xalan.jar : contient l'outil du groupe Apache pour les transformations XSL

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 :

  • javax.xml.parsers
  • javax.xml.transform
  • org.w3c.dom
  • org.xml.sax

JAXP définit deux exceptions particulières :

  • FactoryConfigurationError est levée si la classe du parseur précisée dans la variable System ne peut être instanciée
  • ParserConfigurationException est levée lorsque les options précisées dans la factory ne sont pas supportées par le parseur

 

42.6.2. L'utilisation de JAXP avec un parseur de type SAX

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());

 

42.7. Jaxen

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.


Développons en Java v 2.20   Copyright (C) 1999-2021 Jean-Michel DOUDOUX.   
[ Précédent ] [ Sommaire ] [ Suivant ] [ Télécharger ]      [ Accueil ] [ Commentez ]