SAX (Simple API for XML, API simple para XML) es una API de análisis. SAX fue la primera API para XML ampliamente adoptada en Java y más tarde implementada en muchos otros entornos de programación. A partir de Firefox 2 es posible utilizar los analizadores SAX para aplicaciones y extensiones XUL. Para más información, veáse la página de SAX.
Inicio rápido
La funcionalidad de un analizador SAX está disponible a través del componente lector de XML. Para crear uno, utiliza el siguiente trozo de código:
var xmlReader = Components.classes["@mozilla.org/saxparser/xmlreader;1"] .createInstance(Components.interfaces.nsISAXXMLReader);
Después de que hayas creado un analizador SAX, necesitarás asociar los manejadores de eventos que te interesen y arrancar el proceso de análisis. Todas las funcionalidades están disponible a través de la interfaz nsISAXXMLReader.
Estableciendo los manejadores
Los manejadores son objetos definidos por el usuario que implementan las interfaces de manejadores SAX y dependiendo de la clase de información que necesita obtener desde el analizador. Una vez comenzado el proceso de análisis, los manejadores asociados serán llamados por el analizador (callbacks) con el contenido de XML que está siendo analizado. Los siguientes manejadores están disponibles:
Interfaz | Propósito |
---|---|
nsISAXContentHandler | Es notificada sobre el contenido lógico de un documento (p.e.: elementos, atributos, espacios en blanco e instrucciones de proceso). |
nsISAXDTDHandler | Es notificada sobre eventos básicos relacionados con DTDs. |
nsISAXErrorHandler | Es notificada sobre errores en el flujo de entrada. |
nsISAXLexicalHandler | Manejador ampliado de SAX2 para eventos léxicos (p.e.: comentarios y nodos de tipo CDATA, declaraciones DTD y entidades). |
A continuación se muestra un ejemplo de una implementación de un manejador de contenidos más comúnmente usado:
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) { // don't care }, startPrefixMapping: function(prefix, uri) { // don't care }, endPrefixMapping: function(prefix) { // don't care }, // nsISupports QueryInterface: function(iid) { if(!iid.equals(Components.interfaces.nsISupports) && !iid.equals(Components.interfaces.nsISAXContentHandler)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; } };
Iniciar el análisis
El componente XML Reader puede analizar XMLs a partir de una cadena de texto (un nsIInputStream) o asíncronamente a través de la interfaz nsIStreamListener. Abajo se muestra un ejemplo de análisis a partir de una cadena:
xmlReader.parseFromString("<f:a xmlns:f='g' d='1'><BBQ/></f:a>", "text/xml");
Esta llamada desemboca en la siguiente salida (asumiendo que se ha usado el manejador de contenidos mostrado antes):
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