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