AvantagesInconvénients
SAX
  • efficace
  • souple
  • bas niveau
  • nécessité de tracer pour connaître le niveau du parcours
  • obligation de parcourir l'intégralité d'un document
DOM
  • agréable à utiliser pour le programmeur
  • performance très réduite

Existe-t-il une façon différente de traiter du XML en java ?

Allons voir la réponse de Sun. Retour en avril 2002, un groupe d'experts en formation va travailler sur un nouveau moyen d'exploiter le format XML, ils appellent ça JRS 173. Plus d'un an plus tard, la première sortie publique apparaît. La version finale sort en mars 2004. Et, whoua, une version de maintenance a été publiée en février 2007 pendant qu'on fesait du ski sur gazon ! Il y a donc des gens qui savent s'occuper quand il n'y pas assez de neige sur les pistes. Qu'est-ce-qu'une API qui a mijoté pendant 5 an nous réserve ?

StAx

Streaming API for XML. Et oui, le streaming est un moyen de réduire la quantité de données en mémoire.domstax.png

Fonctionnalités

  • Evênements (comme en SAX)
  • API Curseur (read : XMLStreamReader / write : XMLStreamWriter)
  • API Itérateur d'evênement (read : XMLEventReader / write : XMLEventWriter)
  • Factory pour créer ces objets (XMLInputFactory, XMLOutputFactory, XMLEventFactory)

Ecriture avec l'API Curseur

Voici un exemple d'écriture:
import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;



import javax.xml.stream.XMLOutputFactory;

import javax.xml.stream.XMLStreamException;

import javax.xml.stream.XMLStreamWriter;



public class TestXmlStreamWriter {



public static void main(String[] args) throws XMLStreamException,

IOException {

Writer writer = new OutputStreamWriter(

new FileOutputStream("text.xml"), "UTF-8");

XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newInstance()

.createXMLStreamWriter(writer);

xmlStreamWriter.writeStartDocument("UTF-8", "1.0");

xmlStreamWriter.writeStartElement("breakfast_menu");

xmlStreamWriter.writeStartElement("food");

xmlStreamWriter.writeAttribute("name", "Belgian Waffles");

xmlStreamWriter.writeStartElement("price");

xmlStreamWriter.writeCharacters("$5.95");

xmlStreamWriter.writeEndElement();

xmlStreamWriter.writeStartElement("description");

xmlStreamWriter

.writeCharacters("two of our famous Belgian Waffles with plenty of real maple syrup");

xmlStreamWriter.writeEndElement();

xmlStreamWriter.writeEndElement();

xmlStreamWriter.writeEndDocument();

xmlStreamWriter.flush();

xmlStreamWriter.close();

}



}
L'API est pas mal quand on veut sortir du xml de façon légère. Le fichier de sortie est sur une seule ligne mais bien formé. Cette API permet de contrôler un minimum ce qui est écris en xml. Mais il existe des points faibles. Par exemple, suivant les implémentations, un document peut avoir deux éléments "root". Au contraire, elle va nous aider dans d'autres cas. Par exemple, si on a pas fermé tous les éléments, la méthode "close" le fera à notre place. Il est a noter aussi le passage au entities pour les caractères qui appartiennent à la syntaxe xml. En tous cas, l'API d'écriture est très rapide, simple et possède une empreinte mémoire ridicule (seul un objet XStreamWriter est instancié). C'est tout ce qu'on lui demande.
Vous ne trouverez StAX utilisable dans cet article qu'à partir avec Java 5 SE (décembre 2006) ou Java EE 5. Sinon, il faut packager soi-même an ajoutant l'API du JSR et une implémentation quelqonque.
Je pense que c'est la raison pour laquelle cette API n'a pas été massivement adoptée par la communauté des développeur. On hésite toujours à se lier à une spécification de Sun qu'ils n'ont pas intégré à leur coeur applicatif car on doit dans se cas se reposer sur des implémentations d'éditeur propriétaire (coûts de licence) ou open-source (maintenance et pérénité).

Vers une adoption ?

Les technologies XML sont utilisées de plus en plus depuis maintenant plus de 10 ans ! Il serait temps qu'on passe aux choses sérieuses en termes de performance pour éviter de traîner le boulet des langages interprétés. Au cours de mes recherches, j'ai constaté que l'intérêt porté à StAX est croissant depuis sa sortie. Sa livraison dans java 6 devrait marquer son avênement. StAX nous démontre qu'on peut allier API élégante et performante.

Liens

Why StAX ?
La JSR 173 expliquée en tutorial. C'est didactique et indispensable à parcourir.
An Introduction to StAX
Posté en septembre 2003 ! Ce document montre que StAX tarde à s'imposer.
Streaming APIs for XML parsers
Intéressante comparaison entre les implémentations de StAX, Sun est bien placé en août 2005 dans ce whitepaper.
XOM
On a pas fini de se torturer les méninges avec XML, cet auteur prolifique nous le montre en nous présentant XOM.