Java 5 et les standards XML

Ayant eu l'occasion de me pencher sur les nouveautés de Java 5.0 et plus particulièrement sur le support des standards XML, il me semblait naturel de vous en faire profiter via ce billet.

Pour toutes les technos relatives à XML, les API du JDK sont regroupées en JAX (Java API for XML) et chaque JAX répond à une problématique technique:

  • JAXB pour le mapping Objet / XML
  • JAXRPC pour l'invocation de web service
  • JAXM pour l'envoi de message
  • JAXP pour la manipulation des documents XML, etc.

Les principales évolutions rencontrées concernent justement JAXP et en particulier la validation de documents XML et l'extraction de données via XPath.

Validation de documents XML

La validation de documents XML est une opération très pratique puisqu'elle permet de vérifier la structure du document XML mais également, pour certains types de schéma, le typage des données qu'il contient.

Cette opération était déjà possible dans les précédentes version du JDK, par contre

  • seul la syntaxe des DTD était supportée
  • la validation ne pouvait se faire qu'à la lecture du document XML
  • Le document XML devait être lier à son schéma

Le JDK 1.5 vient justement lever ces contraintes avec :

  • Le support d'autres syntaxes de schéma comme XML-Schema et Relax-NG qui entre autres valident le typage des données.
  • La validation peut se faire à n'importe quel moment, entre autre avant la génération d'un fichier XML pour s'assurer que son contenu est bien valide.
  • Il n'est plus nécessaire de lier les documents XML à leur schéma pour les valider, on pourra associer à une fabrique de parseurs un schéma, de telle sorte que tous les parseurs issus de cette fabrique valident les documents XML lors de leur lecture.
// Création de la fabrique de parseurs DOM 
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

// Création d'une fabrique de schémas supportant la //syntaxe XML-schema 
SchemaFactory schemaFactory =    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

// Création et compilation du schéma
Schema schema = schemaFactory.newSchema(new File(schemaFileName));

// Association de la fabrique de parseurs au schéma
factory.setSchema(schema);

DocumentBuilder parseur = factory.newDocumentBuilder()
parseur.parse(new File(xmlFileName));
  • On eut également créer un objet Validator capable de prendre n'importe quel document XML, n'importe quel schéma et de valider l'un par rapport à l'autre à tout moment (à la lecture du document XML ou après l'avoir modifié en mémoire)
// Créer un objet Schema 
SchemaFactory schemaFactory =SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

Schema schema = schemaFactory.newSchema(new File(schemaFileName));

// Création de l'objet Validator, chargé de la validation quand il le souhaite…
Validator validator = currentSchema.newValidator();
          
//Déclenche la validation sur un arbre DOM
validator.validate(new StreamSource(XMLfileName));

Support natif de XPath

Le JDK 1.5 supporte désormais nativement XPath 1.0, c'est-à-dire qu'il vous est possible d'exécuter des requêtes XPath sur une représentation mémoire d'un document XML et donc d'en extraire plus facilement le contenu.

La représentation mémoire de votre document XML sera sous forme d'arbre DOM et se fera donc via l'analyseur du même nom : Il ne vous reste qu'à en extraire le contenu via un objet sur mesure fourni par JAXP : l'objet XPath.

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();          
String nom = xPath.evaluate("/Personne/@nom",doc);
NodeList enfantsNodeList = (NodeList)xPath.evaluate("/Personne/Enfant", doc,XPathConstants.NODESET);

Sur cet exemple on constate qu'il suffit de créer un objet XPath et que ce dernier dispose d'une méthode evaluate() pour appliquer une requête à notre arbre DOM. Dans la spécification 1.0 de XPath, il existe quatre types : string, number, boolean et nodeset. Nous pourrons donc spécifier le type attendu en retour de la méthode evaluate() comme dans l'exemple ci-dessus où un esemble de nœuds est retourné.

Voilà pour ces quelques nouveautés de Java 5 au niveau de XML, Java 6 ne sera pas en reste en termes de nouveautés et plus particulièrement sur JAX-WS et la création des web services à la .Net (avec les annotations), mais aussi avec JAXB et un vrai mapping objet–XML, mais ces sujets seront l'occasion d'un nouveau billet.