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