Méthode d'analyse (parsing) d'un fichier xml - SAX

 

image

 

Cette partie comprend donc 2 classes :

. la classe java qui contient l'appel au parser (annexe 1),

. la classe (exemple : Gestionnaire.java) qui contient les règles à appliquer quand on rencontre telle ou telle balise (voir principe en annexe 2).

 

 

Annexe 1

 

import java.io.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

 

public class Analyse

{

            public static void main (String argv[]) throws IOException, NullPointerException

            {

                        try

                        {

                       

                                   Class c = Class.forName("org.apache.xerces.parsers.SAXParser");

                                   XMLReader parser = (XMLReader) c.newInstance();

                                   // ici, à titre d'exemple, la classe Java effectuant le parsing (l'analyse)
                                   // s'appelle Gestionnaire.java

                                   Gestionnaire gestioner= new Gestionnaire();

                                   parser.setContentHandler(gestioner);

                                   parser.parse("fichier.xml");

                                   . . .

                        }

                        catch(Exception e)

                        {

                                   System.out.println(e);

                        }

            }

}

 

Remarque : le nom du fichier (fichier.xml) est ici en dur. On aurait pu écrire un petit programme de sélection du nom du fichier ou parser tous les fichiers d'un répertoire précis.


Annexe 2

 

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import java.sql.*;

 

class Gestionnaire extends DefaultHandler

{

            /* Déclarations */

            …

 

            public void startDocument()

            {

                        /* Traitement à effectuer au début (connexion à la base…) */

            }         

 

            public void endDocument()

            {

                        /* Traitement à effectuer à la fin (fermeture connexion) */

            }

 

            public void startElement(String namespace, String localName,

                        String qName, Attributes attr) throws SAXException

            {

                        /* Traitement à effectuer lors de la recontre d’une balise ouvrante.

                        La chaîne qName contient le nom de la balise.

Il faudra penser à remettre la variable donnees à vide */

            }

           

            public void endElement(String namespace, String localName,

                        String qName) throws SAXException

            {

                        /* Traitement à effectuer lors de la recontre d’une balise fermante.

                        La chaîne qName contient le nom de la balise.

Il faudra penser à remettre la variable donnees à vide */

            }

                       

            public void characters(char[] ch, int deb, int longueur) throws SAXException

            {

/* Méthode appelée automatiquement par le parseur à chaque fois qu'il rencontre des caractères entre deux balises ouvrante/fermante.

                        ch désigne les caractères reçus.

                        deb est le rang du premier caractère.

                        longueur est la taille de la chaîne reçue. */

 

donnees = new String(ch, deb, longueur);

            }

}


Exemple d'application

 

On veut créer une application Java permettant d'afficher les résultats d'une course à pied à partir d'un fichier xml "resultatCourse1.xml"

 

Contenu du fichier "resultatCourse1.xml" :

 

<resultat>

            <nomcourse>Trail du méné bré - 2013</nomcourse>>

            <distance>20 kms</distance>

            <coureur>

                        <place>1</place>

                        <nom>THOMAS</nom>

                        <prenom>Yves</prenom>

                        <temps>01:18:22</temps>

            </coureur>

            <coureur>

                        <place>2</place>

                        <nom>LE QUERE</nom>

                        <prenom>Gérard</prenom>

                        <temps>01:20:00</temps>

            </coureur>

            <coureur>

                        <place>3</place>

                        <nom>GARRAULT</nom>

                        <prenom>Yoan</prenom>

                        <temps>01:22:29</temps>

            </coureur>

            <coureur>

                        <place>4</place>

                        <nom>LE GUILLO</nom>

                        <prenom>Cédric</prenom>

                        <temps>01:22:30</temps>

            </coureur>

            <coureur>

                        <place>5</place>

                        <nom>LE CARDUNER</nom>

                        <prenom>Alain</prenom>

                        <temps>01:22:49</temps>

            </coureur>

            <coureur>

                        <place>6</place>

                        <nom>KERLOUET</nom>

                        <prenom>Didier</prenom>

                        <temps>01:24:05</temps>

            </coureur>

            <coureur>

                        <place>7</place>

                        <nom>ANDRE</nom>

                        <prenom>Laurent</prenom>

                        <temps>01:28:51</temps>

            </coureur>

            <coureur>

                        <place>8</place>

                        <nom>ANDRE</nom>

                        <prenom>Stéphane</prenom>

                        <temps>01:29:17</temps>

            </coureur>

            <coureur>

                        <place>9</place>

                        <nom>RIVOALLAN</nom>

                        <prenom>David</prenom>

                        <temps>01:31:14</temps>

            </coureur>

            <coureur>

                        <place>10</place>

                        <nom>MERDY</nom>

                        <prenom>Yann</prenom>

                        <temps>01:35:02</temps>

            </coureur>

            <coureur>

                        <place>11</place>

                        <nom>LOZAHIC</nom>

                        <prenom>Yvon</prenom>

                        <temps>01:35:04</temps>

            </coureur>

            <coureur>

                        <place>12</place>

                        <nom>CAMELI</nom>

                        <prenom>Stéphane</prenom>

                        <temps>01:39:07</temps>

            </coureur>

</resultat>

 

 

import org.xml.sax.*;

import org.xml.sax.helpers.*;

 

public class AnalyseXml

{

 

    public static void main(String[] args)

    {

        try

                        {

                       

                                   Class c = Class.forName("org.apache.xerces.parsers.SAXParser");

                                   XMLReader parser = (XMLReader) c.newInstance();

                                   // ici, à titre d'exemple, la classe Java effectuant le parsing (l'analyse)

                                   // s'appelle Analyseur.java

                                   Analyseur analyse= new Analyseur();

                        parser.setContentHandler(analyse);

                        parser.parse("C:\\Bureau\\Atelier 10b (parsing Sax)\\resultatCourse1.xml");

                        Course maCourse = analyse.retourneCourse();

                        System.out.println(maCourse.getNom());

                        System.out.println(maCourse.getDistance());

                        System.out.println("nbre de coureurs : " + maCourse.getColCoureur().size());

                        }

                        catch(Exception e)

                        {

                                   System.out.println(e);

                        }

    }

}

 

 

package analysexml;

 

import java.util.ArrayList;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

/**

 *

 * @author papa

 */

public class Analyseur extends DefaultHandler

{

            // Déclarations

        Course maCourse;

        ArrayList<Coureur> colCoureur;

        Coureur monCoureur;

        String baliseCourante;

       

            public void startDocument()

            {

            /* Traitement à effectuer au début */

            }         

 

            public void endDocument()

            {

            /* Traitement à effectuer à la fin */

            }

 

            public void startElement(String namespace, String localName,

                        String qName, Attributes attr) throws SAXException

            {

            if (qName.equals("resultat"))

            {

                maCourse = new Course();

                colCoureur = new ArrayList();

            }

            else

            {

                if (qName.equals("coureur"))

                {

                    monCoureur = new Coureur();

                }

            }

            baliseCourante = qName;

            }

           

            public void endElement(String namespace, String localName,

                        String qName) throws SAXException

            {

            if (qName.equals("coureur"))

            {

                colCoureur.add(monCoureur);

            }

            else

            {

                if (qName.equals("resultat"))

                {

                    maCourse.setColCoureur(colCoureur);

                }

            }

            }

                       

            public void characters(char[] ch, int deb, int longueur) throws SAXException

            {

            String donnees = new String(ch, deb, longueur);

            if (!Character.isISOControl(ch[deb])) // Controle effectué à cause des retours à la ligne

            {

                if (baliseCourante.equals("nomcourse"))

                {

                    maCourse.setNom(donnees);

                }

                else

                {

                    if (baliseCourante.equals("distance"))

                    {

                        maCourse.setDistance(donnees);

                    }

                    else

                    {

                        if (baliseCourante.equals("coureur"))

                        {

                            monCoureur = new Coureur();

                        }

                        else

                        {

                            if (baliseCourante.equals("place"))

                            {

                                monCoureur.setPlace(Integer.parseInt(donnees));

                            }

                            else

                            {

                                if (baliseCourante.equals("nom"))

                                {

                                    monCoureur.setNom(donnees);

                                }

                                else

                                {

                                    if (baliseCourante.equals("prenom"))

                                    {

                                        monCoureur.setPrenom(donnees);

                                    }

                                    else

                                    {

                                        if (baliseCourante.equals("temps"))

                                        {

                                            monCoureur.setTemps(donnees);

                                        }

                                    }

                                }

                            }

                        }

                    }

                }

            }

            }

        public Course retourneCourse()

        {

            return maCourse;

        }

}