TUTORIELS 
Les analyseurs syntaxiques XML
Les informations contenues dans les balises d'un document XML peuvent être récupérées simplement par des outils spécifiques, des " analyseurs syntaxiques ".  (18 mars 2001)
 

Récupérer les informations contenues dans les balises d'un document XML (eXtensible Markup Language) peuvent être récupérées simplement par des outils spécifiques, des « analyseurs syntaxiques » (interpréteurs ou « parseurs », ce dernier terme étant dérivé de l'anglais), qui vont être capables de distinguer et récupérer chaque information suivant son type : balise se début, balise de fin, contenu de balise.

Différents analyseurs syntaxiques
Un analyseur syntaxique est à même de traiter tout document XML « bien construit » (à savoir sans balises non terminées, sans balises incorrectement imbriquées, etc…) et produit des messages d'erreur s'il rencontre un document « mal construit ». Mais un document « bien construit » se doit d'être également « valide », c'est-à-dire qu'il doit correspondre à sa définition de type de document (DTD, pour Document Type Definition). La DTD définit un « langage de balisage », qui décrit les balises qui lui sont propres, ainsi que les attributs de ces balises. Il existe ainsi, parmi d'autres, des DTD pour le traitement d'équations mathématiques (MathML) ou pour le traitement des échanges de données électroniques (XML/EDI). Les analyseurs syntaxiques « validants » ne se contentent pas, comme leurs homologues « invalidants » de vérifier si tel document XML est « bien construit » ou pas (sur le modèle des analyseurs syntaxiques des navigateurs web pour les documents HTML), mais vérifient également sa conformité à la DTD qui lui est associée.
Parmi les analyseurs syntaxiques XML « validants » les plus répandus, citons : Xerces (Java, C++, Perl), IBM XML Parser (Java), Oracle XML Parser (Java, C, C++, PL/SQL), ou encore MSXML, de Microsoft (Java, inclus dans Internet Explorer à partir de la version 4)
Enfin, parmi les analyseurs « invalidants » figure, par exemple, XP (Java).

L'API SAX2
Les règles concernant l'analyse syntaxique des documents XML ont été standardisées au sein d'une API (Application Programmation Interface, ou interface de programmation d'application) disponible depuis mai 1998, issue de développements coordonnées par David Megginson, et disponible gratuitement : SAX (Simple API for XML). Cette API est « orientée événement », ce qui la distingue de l'autre API XML implémentée par nombre d'analyseurs, le DOM (Document Object Model), basée sur la construction d'une arborescence interne au document XML. SAX renvoie ainsi à l'application qui manipule le document XML les « événements » (ouverture de balise, fermeture de balise, contenu textuel) qui le constituent. SAX existe en version Java (2.0), Perl (PerlSAX est inclus dans libxml-perl), Python, et, à l'état de prototypes, C++. Nous examinerons ici la version Java.

SAX est une interface (et non un analyseur syntaxique) composée de deux ensembles « packages »  de classes : org.xml.sax et org.xml.sax.helpers. Parmi ces classes, org.xml.sax.ContentHandler contient les méthodes qui vont nous permettre de gérer les événements :

- startDocument() et endDocument() : ouverture et fermeture du document;
- startElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName, Attributes atts) et endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName) : ouverture et fermeture d'un élément;       
- characters(char[] ch, int start, int length) : contenu textuel.

Cette classe est implémentée par une classe « utile » : org.xml.sax.helpers.DefaultHandler, dont nous allons pouvoir créer une classe dérivée afin de redéfinir chacune des méthodes évoquées plus haut. Ainsi, par exemple, on redéfinira la méthode startElement (entrée dans une balise) de manière à préciser, pour des balises spécifiques, quels traitements doivent y être effectués.
Le code suivant « dérive » la classe org.xml.sax.helpers.DefaultHandler :

import org.xml.sax.helpers.DefaultHandler;
public class MonAppliSAX extends DefaultHandler {
   public MonAppliSAX() {
     super();
   }
}


Il nous faut également implémenter org.xml.sax.XMLReader (interface de l'analyseur syntaxique) : cela nécessite de connaître le nom du pilote SAX que notre analyseur syntaxique XML utilise. Il est possible de choisir ce pilote de manière dynamique en utilisant la méthode createXMLReader() de la classe « utile » XMLReaderFactory (« package » org.xml.sax.helpers). Nous pourrons alors associer une instance de notre classe MonAppliSAX à notre analyseur syntaxique pour certains types d'évènements (ici, les événements « de contenu » standards, cités plus haut, et les événements d'erreur) :

public static void main(String args[])
                        throws Exception {
  XMLReader pilote = XMLReaderFactory.createXMLReader();
  MonAppliSAX recepteur = new MonAppliSAX();
  pilote.SetContentHandler(recepteur);       
  pilote.SetErrorHandler(recepteur);
}


L'analyseur va donc renvoyer les événements à notre classe dérivée (c'est là tout le but de la manœuvre) qui les traitera par l'intermédiaire de ses méthodes. A noter que l'objet handler, ici une instanciation de MonAppliSAX, peut être de nature différente (un objet séparé), suivant l'application.

On écrira donc, dans ce cas simple:

import org.xml.sax.XMLReader;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.helpers.DefaultHandler;

public class MonAppliSAX extends DefaultHandler {
  public static void main(String args[])
                                    throws Exception {
    XMLReader pilote = XMLReaderFactory.createXMLReader();
    MonAppliSAX recepteur = new MonAppliSAX();
    pilote.SetContentHandler(recepteur);  
    pilote.SetErrorHandler(recepteur);

    // Lecture des fichiers XML en ligne de commande      
    for (int i=0; i<args.length; i++) {  
      FileReader fichierXML = new FileReader(args[i]);        
      pilote.parse(new InputSource(fichierXML));
    }
  }
  public MonAppliSAX() {
    super();
  }
}


Puis on rédéfinira les méthodes nécessaires suivant les objectifs de notre application Java. Des explications plus détaillées (en anglais uniquement) peuvent être consultées sur le site de SAX, ou encore (en français, mais se référant aux versions 1.0 de SAX) sur les pages suivantes :

http://users.etu.info.unicaen.fr/~khuard/projet/
compterendu/ node25.htm


http://perso.club-internet.fr/hironico/xml/xml_debutant/
(section traitant de SAX)

A noter que le DOM, cité plus haut, constitue une interface alternative à SAX, permettant de restituer l'arborescence d'un document XML afin de la manipuler ou la compléter. Pour plus d'informations sur le DOM, consulter l'article
Exemple d'utilisation
L'analyse syntaxique d'un document XML est essentielle au développement d'applications qui manipulent ce type de document. Celles-ci sont nombreuses, et on pourra citer, à titre d'exemple, des servlets Java qui récupèrent le contenu des balises XML, les associent à un document XSL (eXtensible Stylesheet Language, les feuilles de style XML), qui contiendra les règles pour la conversion en pages HTML des données XML, et fournissent ensuite des pages formatées à la volée (par exemple pour alimenter un portail personnalisé). Le lien suivant illustre cette technique, en fournissant des précisions détaillées sur XML et les servlets Java :
http://developer.iplanet.com/viewsource/marchal_xml.htm

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page