Simple API for XML

De Viquipèdia
Dreceres ràpides: navegació, cerca

SAX (Simple API for XML) és una forma de processar els documents XML basada en events.[1] Amb SAX s'obté una forma alternativa a l'estàndard Document Object Model (DOM) de llegir les dades contingudes en un document XML.

Originalment es va pensar per Java però es pot trobar en molts altres llenguatges de programació: C, Perl o Python. SAX no està definida en cap estàndard formal sinó que s'ha agafat l'especificació de Java com a normativa de referència.[2] SAX processes documents state-independently, in contrast to DOM which is used for state-dependent processing of XML documents.[3]

El funcionament és senzill: el parser va llegint el fitxer i va generant events cada vegada que es troba alguna cosa rellevant: Començament o final d'un document, inici o final d'una etiqueta, contingut, etc...

En general un parser SAX:

  • Detecta quan comença i acaba un element, el document o un conjunt de caràcters
  • Gestiona els espais de noms
  • Comprova que els documents estiguin ben formats

Avantatges[modifica | modifica el codi]

  • És ràpid perquè només requereix llegir el document
  • No carrega tot el document a memòria ja que genera els events a mesura que els va llegint
  • És senzill

Inconvenients[modifica | modifica el codi]

  • El tractament seqüencial que fa dels documents implica que:
    • No pot tornar enrere.
    • No és eficient llegint dades aleatòriament (perquè ha de llegir tot el document)
  • No serveix per crear documents XML

Exemple[modifica | modifica el codi]

En llenguatge Java s'ha de crear un parser SAX (SAXParser) a partir d'un objecte de fàbrica de parsers(SAXParserFactory). Un cop creat al parser se li proporcionen el fitxer a processar (test.xml) i la classe que rebrà els events (Processar).

import java.io.*;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
    
public class Sacseja throws ParserConfigurationException, SAXException, IOException{
    public static void main(String[] argv) 
    {
          SAXParserFactory spf = SAXParserFactory.newInstance();
          SAXParser parser = spf.newSAXParser();
          parser.parse(new File("test.xml"), new Processar());
    }
}

Després només cal implementar la classe Processar en la que es reescriuran les funcions que facin referència als events que es vulguin tractar. En aquest exemple es volen comptar el nombre d'etiquetes que hi ha i per tant es sobreescriuen startElement que es cridarà cada cop que arribi una etiqueta i endDocument per mostrar el resultat final

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Procesar extends DefaultHandler {
    int numelements=0;
    public void endDocument() throws SAXException{
        System.out.println("Total etiquetes: " + numelements);	
    }	
    
    public void startElement(String uri, String localName, 
                             String qName, Attributes attributes) {
       numelements++;	
    }
}

El programa ens imprimirà per pantalla el nombre d'etiquetes que hi ha en el document.

Referències[modifica | modifica el codi]

  1. «SAX». http://www.webopedia.com/:+ WEBOPEDIA. [Consulta: 2 maig 2011]. «Short for Simple API for XML, an event-based API that, as an alternative to DOM, allows someone to access the contents of an XML document. SAX was originally a Java-only API. The current version supports several programming language environments other then Java. SAX was developed by the members of the XML-DEV mailing list.»
  2. saxproject.org
  3. «Simple API for XML». http://oracle.com/:+ ORACLE. [Consulta: 2 maig 2011]. «Note: In a nutshell, SAX is oriented towards state independent processing, where the handling of an element does not depend on the elements that came before. StAX, on the other hand, is oriented towards state dependent processing. For a more detailed comparison, see SAX and StAX in Basic Standards and When to Use SAX.»

Enllaços externs[modifica | modifica el codi]