SAX e DOM Analisi di un documento

© 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