© M. Badella G. Malnati, 2003-04 SAX e DOM Programmazione in Ambienti Distribuiti A.A. 2003-04 © M. Badella G. Malnati, 2003-04 Analisi di un documento Il parser è uno modulo software utilizzato per l’analisi di un documento Eseguire il parsing di un documento significa costruire l’albero sintattico ad esso associato ¾ eventualmente, verificandone la rispondenza con lo schema del documento L’albero ottenuto costituisce la base di ulteriori elaborazioni ¾ Traduzioni verso altri formati, interpretazione, … Programmazione in Ambienti Distribuiti 2 w1 Analisi di documenti XML © M. Badella G. Malnati, 2003-04 L’analisi del documento avviene ¾ scandendo la sequenza dei simboli terminali … ¾ … aggregandoli in entità più complesse sulla base dei tag… ¾ … in base alle semplici regole del XML L’interpretazione si crea associando ai nodi così costruiti un significato Programmazione in Ambienti Distribuiti 3 Parser XML © M. Badella G. Malnati, 2003-04 Esistono due approcci differenti per la realizzazione di un parser: ¾ Costruzione esplicita dell’albero sintattico o Il documento XML viene rappresentato in modo esplicito, ad ogni nodo corrisponde un elemento o Il parser naviga la struttura ad albero così realizzata assegnandole un’interpretazione ¾ Modello ad eventi: o Si scandisce il documento in ingresso generando eventi ogni qualvolta viene identificato un contenuto significativo (inizio elemento, fine elemento, testo racchiuso, errori, …) o Il parser reagisce agli eventi assegnando un’interpretazione alla struttura ad albero implicitamente definita Programmazione in Ambienti Distribuiti 4 w2 © M. Badella G. Malnati, 2003-04 XML e Java Le specifiche di Java definiscono due interfacce per l’analisi di documenti XML ¾ Simple API for XML (SAX) o parser basato sul modello ad eventi ¾ Document Object Model (DOM) o parser che traduce il documeto XML in una gerarchia di oggetti Java Entrambe utilizzano un motore di analisi generico Programmazione in Ambienti Distribuiti 5 Validazione © M. Badella G. Malnati, 2003-04 È possibile costruire un parser ¾ Non validante o Non si occupa di verificare le regole del DTD o Analizza solo il contenuto dei tag o Efficiente e veloce, ma poco sicuro ¾ Validante o Verificare regole specifiche espresse nel DTD o Meno efficiente ma sicuro Programmazione in Ambienti Distribuiti 6 w3 © M. Badella G. Malnati, 2003-04 SAX Simple API for XML Parser basato su un modello ad eventi ¾ Implementazione in vari linguaggi (Java, C++, …) Il documento viene visto come un flusso di dati ¾ I singoli elementi vengono analizzati e gestiti man mano che si presentano Sito ufficiale ¾ http://sax.sourceforge.net/ Programmazione in Ambienti Distribuiti 7 SAX © M. Badella G. Malnati, 2003-04 Eventi segnalati: ¾ Inizio e fine del documento ¾ Inizio e fine degli elementi ¾ Errori ¾… SAX implementa un parser generico: ¾ L’applicazione, quando richieda un’analisi, specifica l’oggetto/le funzioni da richiamare a fronte dei singoli eventi Programmazione in Ambienti Distribuiti 8 w4 Java e SAX © M. Badella G. Malnati, 2003-04 Le API sono contenute nei package ¾ javax.xml.parser ¾ org.xml.sax ¾ org.xml.sax.ext ¾ org.xml.sax.helpers Contengono le classi e le interfacce necessarie alla creazione e alla gestione di un parser SAX Programmazione in Ambienti Distribuiti 9 Java e SAX © M. Badella G. Malnati, 2003-04 javax.xml.parser ¾ Contiene SAXParserFactory che definisce una classe factory per configurare e costruire un parser SAX org.xml.sax contiene le interfacce che il gestore degli eventi deve implementare ¾ ContentHandler, DTDHandler, EntityResolver, ErrorHandler Per semplicità conviene estendere la classe ¾ org.xml.sax.helpers.DefaultHandler Programmazione in Ambienti Distribuiti 10 w5 Creazione di un parser © M. Badella G. Malnati, 2003-04 I parser XML sono creati utilizzando il Factory Design Pattern ¾ Si crea un oggetto parser a partire da un oggetto factory ¾ Factory permette di specificare le caratteristiche/opzioni del parser che deve essere costruito Programmazione in Ambienti Distribuiti 11 © M. Badella G. Malnati, 2003-04 Esempio (1) class MyHandler extends DefaultHandler { int errorCounter=0; public void error(SAXParseException e) throws SAXException { errorCounter++; } public int getErrorCounter() { return errorCounter; } } Programmazione in Ambienti Distribuiti 12 w6 © M. Badella G. Malnati, 2003-04 Esempio (2) SAXParserFactory spf= SAXParserFactory.newInstance(); spf.setValidating(true); SAXParser p= spf.newSAXParser(); MyHandler h= new MyHandler(…); FileInputStream fis = new FileInputStream(“c:\test.xml”); p.parse(fis,h); System.out.println(h.getErrorCounter()); Programmazione in Ambienti Distribuiti 13 Applicazioni di SAX © M. Badella G. Malnati, 2003-04 Dovrebbe essere utilizzato: ¾ Documenti XML di dimensioni consistenti o Dispositivi con memoria limitata ¾ Elaborazioni veloci Non adatto per ¾ Modifica del documento ¾ ricordare eventi precedenti o codice ad hoc Programmazione in Ambienti Distribuiti 14 w7 © M. Badella G. Malnati, 2003-04 DOM Document Object Model Parser basato sulla costruzione esplicita dell’albero sintattico ¾ L’albero gerarchico rappresenta il documento ¾ Supporta la navigazione e la modifica del documento Le specifiche sono indipendenti dal linguaggio ¾ Java, C++, CORBA, JavaScript,… Sito ufficiale ¾ http://www.w3c.org/DOM 15 Programmazione in Ambienti Distribuiti L’albero sintattico © M. Badella G. Malnati, 2003-04 Document Document type Element Comment Element Element Attribute Text Attribute Attribute Text Programmazione in Ambienti Distribuiti 16 w8 Java e DOM © M. Badella G. Malnati, 2003-04 Le API sono contenute nei package ¾ javax.xml.parser ¾ org.w3c.dom Contengono le classi e le interfacce necessarie per ¾ creazione di un parser DOM ¾ gestione e modifica dell’albero generato dal parsing Programmazione in Ambienti Distribuiti 17 Java e DOM © M. Badella G. Malnati, 2003-04 javax.xml.parser: ¾ DocumentBuilderFactory definisce la factory che consente all’applicazione di ottenere il parser DOM ¾ DocumentBuilder è la classe che permette di ottenere una istanza dell’albero relativo al documento XML org.w3c.dom ¾ contiene le interfacce che consentono la rappresentazione del documento XML come albero ¾ Attr, CDATASection, CharacterData, Comment, Document, DocumentFragment , DocumentType, DOMImplementation, Element , Entity , EntityReference, NamedNodeMap, Node, NodeList, Notation, ProcessingInstruction, Text Programmazione in Ambienti Distribuiti 18 w9 Creazione di un parser © M. Badella G. Malnati, 2003-04 Analogamente a SAX, il parser DOM è creato utilizzando il Factory Design Pattern ¾ Si crea un oggetto parser partendo da un oggetto factory (DocumentBuilderFactory) ¾ Successivamente si ottiene un oggetto DocumentBuilder che consente il parsing del documento e l’estrapolazione dell’albero Programmazione in Ambienti Distribuiti 19 © M. Badella G. Malnati, 2003-04 Esempio … String filename=“c:\test.xml”; DocumentBuilderFactory buildFactory= DocumentBuiderFactory.newInstance(); DocumentBuider builder= buildFactory.newDocumentBuilder(); buidFactory.setValidating(true); Document doc=builder.parse(filename); doc.getDocumentElement().normalize(); … Programmazione in Ambienti Distribuiti 20 w10 © M. Badella G. Malnati, 2003-04 Navigazione dell’albero Elemento radice: Element root=doc.getDocumentElement(); Element è una sottoclasse di Node e rappresenta un elemento XML È possibile ottenere: ¾ ¾ ¾ ¾ Il nome (getNodeName) Il tipo (getNodeType) Gli attributi (getAttributes) … Modificare la struttura del documento ¾ ¾ ¾ ¾ Assegnazione di testo ad un elemento (setNodeValue) Nuovo nodo figlio (appendChild) Eliminazione nodo figlio (removeChild) … Programmazione in Ambienti Distribuiti 21 Vantaggi e Svantaggi © M. Badella G. Malnati, 2003-04 Vantaggi ¾ API robusta ¾ Semplicità nella modifica della struttura e nell’estrazione delle informazioni Svantaggi ¾ API complessa ¾ Considerevole quantità di memoria occupata per la memorizzazione dell’albero Programmazione in Ambienti Distribuiti 22 w11 Altre implementazioni © M. Badella G. Malnati, 2003-04 Apache XML Project Xerces Java Parser ¾ http://xml.apache.org/xerces-j/index.html IBM’s XML for Java (XML4J) ¾ http://www.alphaworks.ibm.com/formula/xml … Programmazione in Ambienti Distribuiti 23 w12