parse - e

Transcription

parse - e
SAX
Jean-Jacques LE COZ
Simple API for XML
Historique

Projet démarré en 1997

Instigateurs



Développeurs principaux


John Tigue de DataChanel
Communauté de la Mailing list XML-DEV
Peter Murray, Tim Bray, David Megginson et
Jon Bosak
Première version de SAX

SAX 1.0 mai 1998
Versions
Simple API for XML (SAX)
 Versions 2.x ou encore appelée SAX 2.0

SAX2 : 2001
 SAX 2.0.1 : 2002
 Version actuelle SAX 2.0.2 : 2004

Standardisation
SAX n'est pas un projet du W3C
 Mais compte tenu de son succès est un
standard de fait.
 Originellement SAX est un parser pour
JAVA
 Porté vers d'autres langages


C, C++, Pascal, Perl, Python
Types de parser

Pull parsing
STAX appartient à cette catégorie
 Un parser de ce type crée un itérateur¹
pour visiter les éléments d'un document




Ceci permet la récursivité
La structure du code reflète la structure du
document
Avec l'aide de l'itérateur l'application dirige la
visite du document
1: Design pattern Iterator
Types de parser

Push parsing
SAX appartient à cette catégorie
 C'est le parser qui dirige la visite du document.
 L'application est soumise au parser
 Le parser déclenche des méthodes prédéfinies
à chaque événement rencontré pendant la
visite


Ouverture, fermeture d'élément, etc.
SAX parser événementiel
Logique événementielle
SAX lève des méthodes prédéfinies sur la
rencontre d'événements
 Ces événements concernent la rencontre
des éléments qui constituent le document
XML



Document, élément
Événements

Début et fin du document, ouverture et
fermeture des éléments
Exemple
<?xml version=''1.0''?>
<exemple>
<serveur>UNIX</serveur>
<moniteur>COULEUR</moniteur>
</exemple>
Start document
Start element (exemple)
Characters (white space)
Start element (serveur)
Characters (UNIX)
Résultat du parsing SAX
End element (serveur)
Start element (moniteur)
Characters (COULEUR)
End element (moniteur)
Characters (white space)
End element (exemple)
Les étapes avec SAX
1.Création d'un gérant d'événements
2.Création d'un parser SAX
3.Affecter le gérant au parser
4.Parser le document

Chaque événement est envoyé au gérant
Intérêt de SAX
Peut gourmand en mémoire
 La logique est séquentielle
 Contrairement à DOM il n'y a pas de
représentation du document en mémoire
 Très rapide

Limites de SAX

Pas de représentation persistante du
document

Il faut mémoriser les valeurs pertinentes
tout au long du parsing
Pas de retour en arrière
 L'application est soumise à la logique du
push

Utilisation de SAX
JAVA SE 6 et SAX

Implémentation dans JAVA SE 6
Dans le paquetage org.xml.sax
 Le gérant d'événements



Le parser


Implémente l'interface ContentHandler
Implémente l'interface XMLReader
Le gérant est affecté au parser par la méthode

setContentHandler()
Les méthodes levées par les
événements

ContentHandler
characters()
 endDocument()
 endElement()
 startDocument()
 startElement()
 etc.


Ces méthodes nécessitent une gestion
d'exception avec SAXException
La méthode startElement()

Signature de la méthode

void startElement(String uri,
String localName,
String qName,
Attributes atts)
throws SAXException
Les arguments de la méthode

uri
De type String
 Représente l'espace de nom du document


localName
De type String
 Représente le nom de l'élément dans l'espace
de nom ci-dessus

Les arguments de la méthode

qName
De type String
 Représente le nom de l'élément si il n'y a pas
d'espace de nom


atts
De type Attributes
 Représente la collection des attributs de
l'élément

Les attributs d'un élément

Récupération des valeurs CDATA
Attributes se comporte comme une forme
de collection JAVA
 Itération

for(int i = 0; i < atts.getLength(); i++)
System.out.println(atts.getValue(i));
La méthode characters()

Signature de la méthode


void characters(char[], int start, int length)
Elle permet de récupérer les valeurs
PCDATA
Un exemple de gérant
public class Gerant implements ContentHandler {
public Gerant() {}
@Override
public void endDocument() throws SAXException {
System.out.println("FIN DOCUMENT");
}
@Override
public void startDocument() throws SAXException {
System.out.println("DEBUT DOCUMENT");
}
...
}
Obtenir un parser

A partir d'une fabrique


XMLReaderFactory
En invoquant la méthode

createXMLReader()
XMLReader parseur = XMLReaderFactory.createXMLReader();
Exemple de parsing
public static void main(String[] args) {
try {
XMLReader parseur = XMLReaderFactory.createXMLReader();
parseur.setContentHandler(new Gerant());
FileReader lecteur = new FileReader("/Chemin/data.xml");
parseur.parse(new InputSource(lecteur));
} catch (SAXException e) {e.printStackTrace();
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}
}
Les caractères blancs et
d' échappement
La méthode characters() ne prend pas
en compte ces caractères
 Elle n'extrait que les valeurs
 Pour récupérer ces caractères

Méthode ignorableWhitespace()
 Il faut que l'attribut xml:space dans le
document XML soit à la valeur preserve

<balise xml:space="preserve">
Rappels XML

Une valeur PCDATA


<balisexml>VALEUR</balisexml>
Une valeur CDATA

<balisexml attribut=''valeur'' />
Ressources

Bibliographie


SAX2 – David Brownell – O'REILLY
Web

www.saxproject.org

Documents pareils