1 

Lire un fichier XML en JAVA avec SAX

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.


1 

Retrouvez ci-dessous les autres sections du Laboratoire Sun
Evènements
Java Sun Net Talk LIVE CHAT le 2 Avril à 16h303/29/08
SolarisSunDécouvrez les nouveaux Sun Fire sous Intel10/11/07
JavaValtech Days10/9/07
JavaApacheCon du 1 au 4 mai à Amsterdam2/13/07

Exemples de code
JavaManipuler les looks and feel (lister et affecter)10/15/07
JavaFaire sa propre injection de dépendance avec les annotations5/9/06
JavaSplash screen avec progress Bar5/5/06
JavaFaire un splash screen en swing5/5/06

Actualités
SunProjet Kenai: une nouvelle forge open source10/3/08
SunSun Microsystems en forme !8/4/08
SunOpenDS un ldap 100% java7/24/08
SunSun et Fujitsu annoncent un nouveau Sparc647/16/08
SunVisualVM, un outil de surveillance des applications Java7/10/08

Tips du laboratoire
EclipseVisual Editor avec Eclipse Europa, c'est possible3/28/08
EclipseGérer les projets dans un workspace.10/16/07
JavaManager votre server d'application avec Eclipse4/21/07
JavaVue des sub-packages avec Eclipse4/21/07
JavaGlisser-déposer avec Eclipse4/21/07

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright SUPINFO International University
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée