SAX

par 2 contributeurs :

SAX, qui signifie Simple API for XML, est une API d'analyse XML. SAX a été la première API pour XML à connaître le succès en Java, et a ensuite été adaptée dans plusieurs autres environnements de programmation. À partir de Firefox 2, un analyseur SAX est accessible aux applications XUL et aux extensions. Pour plus d'informations, consultez la page d'accueil de SAX.

Pour commencer

Les fonctionnalités d'analyse SAX sont disponibles au travers du composant XML reader. Pour en créer un, utilisez le code suivant :

var xmlReader = Components.classes["@mozilla.org/saxparser/xmlreader;1"]
                          .createInstance(Components.interfaces.nsISAXXMLReader);

Après avoir créé l'analyseur SAX, il est nécessaire de définir des gestionnaires pour les évènements qui vous intéressent, et de déclencher le processus d'analyse. Toutes ces fonctionnalités sont disponibles au travers de l'interface nsISAXXMLReader.

Définition des gestionnaires

Les gestionnaires sont des objets créés par l'utilisateur, implémentant les interfaces de gestion de SAX selon le type d'informations qu'on désire obtenir de l'analyseur. Lorsque le processus d'analyse est lancé, les gestionnaire reçoivent une série d'appels pour le contenu du XML analysé. Les gestionnaires disponibles sont les suivants :

Interface Objectif
nsISAXContentHandler Reçoit des notifications concernant le contenu logique d'un document (par exemple des éléments, attributs, blancs et instructions de traitement).
nsISAXDTDHandler Reçoit des notifications concernant les évènements basiques liés aux DTD.
nsISAXErrorHandler Reçoit des notifications concernant les erreurs dans le flux d'entrée.
nsISAXLexicalHandler Gestionnaire d'extension de SAX2 pour les évènement lexicaux (par exemple les commentaires et nœuds CDATA, les déclarations DTD et les entités).

Un exemple d'implémentation des gestionnaires de contenu les plus courants :

function print(s) {
  dump(s + "\n");
}

xmlReader.contentHandler = {
  // nsISAXContentHandler
  startDocument: function() {
    print("startDocument");
  },
  
  endDocument: function() {
    print("endDocument");
  },
  
  startElement: function(uri, localName, qName, /*nsISAXAttributes*/ attributes) {
    var attrs = [];
    for(var i=0; i<attributes.length; i++) {
      attrs.push(attributes.getQName(i) + "='" + 
                 attributes.getValue(i) + "'");
    }

    print("startElement: namespace='" + uri + "', localName='" + 
          localName + "', qName='" + qName + "', attributes={" + 
          attrs.join(",") + "}");
  },
  
  endElement: function(uri, localName, qName) {
    print("endElement: namespace='" + uri + "', localName='" + 
          localName + "', qName='" + qName + "'");
  },
  
  characters: function(value) {
    print("characters: " + value);
  },
  
  processingInstruction: function(target, data) {
    print("processingInstruction: target='" + target + "', data='" + 
          data + "'");
  },
  
  ignorableWhitespace: function(whitespace) {
    // ne pas traiter
  },
  
  startPrefixMapping: function(prefix, uri) {
    // ne pas traiter
  },
  
  endPrefixMapping: function(prefix) {
    // ne pas traiter
  },
  
  // nsISupports
  QueryInterface: function(iid) {
    if(!iid.equals(Components.interfaces.nsISupports) &&
       !iid.equals(Components.interfaces.nsISAXContentHandler))
      throw Components.results.NS_ERROR_NO_INTERFACE;
    return this;
  }
};

Début de l'analyse

Le composant XML Reader peut analyser du XML contenu dans une chaîne, un flux nsIInputStream, ou de manière asynchrone via l'interface nsIStreamListener. Ci-dessous, un exemple d'analyse depuis une chaîne :

xmlReader.parseFromString("<f:a xmlns:f='g' d='1'><BBQ/></f:a>", "text/xml");

Cet appel conduit à la sortie suivante (en supposant qu'on utilise le gestionnaire de contenu de l'exemple ci-dessus) :

startDocument
startElement: namespace='g', localName='a', qName='f:a', attributes={d='1'}
startElement: namespace='', localName='BBQ', qName='BBQ', attributes={}
endElement: namespace='', localName='BBQ', qName='BBQ'
endElement: namespace='g', localName='a', qName='f:a'
endDocument

Étiquettes et contributeurs liés au document

Étiquettes : 
Contributeurs à cette page : Mgjbot, BenoitL
Dernière mise à jour par : Mgjbot,