|
1. Introduction
Il existe deux API (application programming interface) standards permettant de lire un flux XML en Java, DOM et
SAX. Nous ne nous intéresserons dans cet article uniquement à SAX.
SAX est l'abréviation de Simple API for XML. Comme son nom l'indique, elle
est plus simple d'utilisation que son homologue DOM. De plus elle présente
l'avantage d'être plus performante pour les gros fichiers XML car toutes les
données ne sont pas chargées en mémoire grâce à l'utilisation d'un modèle
événementiel.
2. Bref rappel sur XML :
XML permet de stocker des informations de manière organisée et hiérarchisée, grâce à des balises
imbriquées les une dans les autres.
Voici un petit exemple pour illustrer le contenu d'un fichier XML et que l'on utilisera pour comprendre l'utilisation de
SAX par la suite.
|
<personne>
<nom>Dupond</nom>
<adresse>
<numero>3</numero>
<rue>rue de la paix</rue>
<ville>Paris</ville>
<codePostal>75001</codePostal>
</adresse>
</personne>
|
3. Utilisation de SAX
3.1. Théorie
Sax est donc basé sur un modèle
événementiel, ce qui signifie que l'analyseur appelle automatiquement une
méthode lorsqu'un événement est détecté dans le fichier XML. Evénement
signifie par exemple détection d'une balise ouvrante, de la fin du document
etc... Voici les 5 évènements détectés par SAX ainsi que les méthodes qui sont
appelées :
Détectioan d'un tag de début => startElement()
Détection d'un tag de fin => endElement()
Détection de données entre deux tags => characters()
Début du traitement du document XML => startDocument()
Fin du traitement du document XML => endDocument()
3.2. Exemple concret
Pour illustrer l'utilisation de SAX, voici un exemple concret de code source qui analyse un fichier:
|
// Parse un document XML en JAVA avec l'Api SAX
//on importe les API necessaires
//pour l'analyse du XML
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
//pour l'acces aux fichiers import java.io.*;
Public class AnalyseSAX extends DefaultHandler {
//methode principale
public static void main (String args[]) throws IOException {
//Si l'utilisateur a oublié de passer
//le nom du fichier XML en parametre => erreur
if (args.length != 1) {
System.err.println("Usage: AnalyseSAX fichierSourceXML");
System.exit (1);
}
//on lance l'analyseur avec le fichier XML en parametre
DefaultHandler handler = new AnalyseSAX();
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = factory.newSAXParser();
saxParser.parse( new File(args[0]), handler );
} catch (Throwable t) {
//Si on a une erreur pendant l'analyse
t.printStackTrace ();
System.exit (1);
}
System.exit (0);
}//fin du main
//Les methodes qui suivent sont appelées
//automatiquement par l'analyseur
//lorsqu'un événement est détecté
//dans le fichier XML.
public void error(SAXParseException e) throws SAXParseException{
throw e;
}
public void startDocument () throws SAXException {
System.out.println("début du document");
}
public void endDocument () throws SAXException {
System.out.println("fin du document");
}
public void startElement (String namespaceURI,String simpleName,String qualifiedName,Attributes attrs) throws SAXException {
String nomElement = simpleName;
if (nomElement.equals("")) nomElement = qualifiedName;
System.out.println("startElement : "+ nomElement);
}
public void endElement (String namespaceURI,String simpleName,String qualifiedName) throws SAXException {
String nomElement = simpleName;
if (nomElement.equals("")){
nomElement = qualifiedName;
}
System.out.println("endElement : "+ nomElement);
}
public void characters (char buf [], int offset, int len)
throws SAXException {
String s = new String(buf, offset,len);
System.out.println (s);
}
}//fin de la classe
|
3.3. Résultat
Lorsqu'on exécute le programme ci-dessus sur le fichier XML présenté à la partie 2, on obtient le résultat suivant :
|
début du document
startElement : personne
startElement : nom
Dupond
endElement : nom
startElement : adresse
startElement : numero
3
endElement : numero
startElement : rue
rue de la paix
endElement : rue
startElement : ville
Paris
endElement : ville
startElement : codePostal
75001
endElement : codePostal
endElement : adresse
endElement : personne
fin du document
|
L'analyseur XML a détecté les balises ouvrantes et les balises fermante, puis a lancé les méthodes correspondantes qui nous permettent d'effectuer le traitement désiré.
4. Conclusion :
Nous avons vu une méthode simple et performante d’accéder
aux fichiers XML en JAVA grâce à l’API SAX.
Cette méthode présente malgré tout quelques inconvénients.
En effet SAX ne permet pas de modifier (ajout, modification, suppression) un
document XML, on ne peut pas effectuer d'accès direct à un élément
(il faut parcourir tout le document de façon séquentielle), et
cette méthode n’est pas encore utilisable par les navigateurs internet…
C’est pour ces raisons que lors de certaines utilisations, SAX ne sera
pas adapté et il sera nécessaire d’utiliser DOM.
|