Méthode d'analyse (parsing) d'un fichier xml - SAX
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).
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.
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;
}
}