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 processa els documents sense haver-los de carregar completament, en contrast amb el que fa DOM que necessita carregar tot el document per poder-hi treballar.[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:
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.