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 manuvre) 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
|