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. 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.

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]

Enllaços externs[modifica | modifica el codi]