DOM e SAX - SisInfLab

Transcript

DOM e SAX - SisInfLab
Corso di Laurea Specialistica in Ingegneria Informatica
Corso di Linguaggi e Tecnologie Web
XML Programming: DOM e SAX
Eufemia TINELLI
A. A. 2011 - 2012
Contenuti
• Obiettivi delle API per XML
• DOM
– Modello ad oggetti
– Esempi
• SAX
– Modello ad aventi
– Esempi
E. TINELLI – LTW A. A. 20112011-2012
2
Gestire file XML
• Leggere e scrivere un file XML usando linguaggi di
programmazione general-purpose (Xpath,XSLT,XSD,XQuery
… sono specificatamente progettati per XML)
• XML è un formato di dati complesso che necessita di un set
minimo di primitive:
– Parsing: tradurre documenti XML in alberi XML
– Navigating: esplorare gli alberi XML
– Manipulating: leggere e modificare alberi XML
– Serializing: tradurre alberi XML in documenti XML di testo
• Compiti del parser (Sun JAXP,Apache Xerces,IBM XML4J,
Microsoft MSXML): Decomporre documenti XML (istanza) nei
loro elementi costitutivi ed eseguire i controlli
• Modelli di parsing: Interfacce basate su oggetti o eventi
E. TINELLI – LTW A. A. 20112011-2012
3
API DOM e SAX a confronto (1)
• XML Document Object Model (DOM)
– W3C Recomendation
– è un modello a oggetti generico applicabile a tutti i documenti XML
– Incapsula ogni elemento XML in un oggetto specifico, che ne fornisce
una interfaccia di manipolazione
– Livello di astrazione: alto
– Le interfacce sono definite sulla base di Interface Definition Language
(OMG IDL; definito nelle specifiche di Corba)
• Simple API for XML (SAX)
– in origine è stata sviluppata come API alternativa per accedere ad XML
in Java Æ È uno standard de-facto SAX 1.0 Maggio 1998, SAX 2.0
Maggio 2000
– non dispone di metodi per la creazione o la modifica di documenti XML
Æ è un sistema di parsing per XML basato sugli eventi
E. TINELLI – LTW A. A. 20112011-2012
4
API DOM e SAX a confronto (2)
• DOM permette un accesso casuale mentre SAX sequenziale
• La scelta di SAX è possibile solo quando il documento va
interpretato e non manipolato
• DOM mantiene in memoria l’albero XML Æ 18MB /
• SAX più “leggero” Æ 1.2GB in 51 seconds
• Tuttavia, conoscere SAX è utile anche se si usa il DOM,
almeno con Xerces, in quanto:
– I metodi DOM come parse, che caricano un documento preesistente
in memoria, usano SAX per leggere ed interpretare la struttura del
documento.
– La gestione degli errori in lettura e scrittura per il DOM è “ereditata”
da SAX.
E. TINELLI – LTW A. A. 20112011-2012
5
DOM – Specifiche
• Il modello ad oggetti definisce:
–
–
–
–
–
Gli oggetti usati per rappresentare e manipolare un
particolare tipo di informazione.
Le interfacce usate per interagire con gli oggetti definiti.
La semantica richiesta dagli oggetti e dalle interfacce definite.
Le relazioni e interazioni tra le interfacce e gli oggetti definiti
• Il modello ad oggetti nel DOM è applicato al documento XML
• DOM rappresenta i documenti come una struttura ad albero
e fornisce un’interfaccia “generica” implementabile in vari
linguaggi di programmazione
• DOM definisce solo la sua vista logica sui dati: non specifica
come debbano essere effettivamente strutturati in memoria
E. TINELLI – LTW A. A. 20112011-2012
6
I Livelli e le implementazioni del DOM
• Livello 1 (W3C Recommendation 1998)
– Definisce gli elementi DOM di base con interfacce contenenti i metodi e
gli attributi di uso più comune
– Non fornisce però accesso ai contenuti del DTD
• Livello 2 (W3C Recommendation 2000)
– Modifica alcuni metodi del livello 1, e introduce il supporto ai
namespaces, accesso agli elementi tramite il valore degli attributi ID e
alla clonazione dei nodi
• Livello 3 (W3C Recommendation 2004)
– Introduce nuovi metodi e interfacce per una navigazione più rapida nel
documento, per il supporto dei tipi di nodo e per la serializzazione
• Implementazioni delle interfacce di DOM per tutti i principali linguaggi
(Java, C#, C++, Phyton,..)
• Le specifiche DOM riportano implementazioni per Java e JavaScript
E. TINELLI – LTW A. A. 20112011-2012
7
Il modello DOM: le intefacce
• L’albero è composto da generici nodi, ognuno dei quali ha una
classificazione più specifica a seconda della sua funzione all’interno
del documento
• Interfaccia Node ha una serie di interfacce derivate tra cui:
–
–
–
–
–
–
Document
Element
Attr
Entity
ProcessingInstruction
CharacterData
• CharacterData ha 2 interfacce derivate:
– Text (da cui è derivata CDATASection)
– Comment
E. TINELLI – LTW A. A. 20112011-2012
8
Alcune primitive DOM (1)
• I nodi dell’albero DOM sono rappresentati da oggetti Node.
– I Node di tipo Element e Document possono avere zero o più nodi figli
– Ogni Node, tranne il Document, ha un nodo genitore.
• Node include le operazioni di base eseguibili su ogni nodo
(indipendentemente dal suo tipo specifico)
• L’attributo nodeType permette di identificare il tipo specifico di nodo
tramite una serie di costanti definite anch’esse nell’interfaccia Node:
ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, ecc.
• I metodi di Node per la manipolazione dei nodi figli sono:
–
–
–
–
appendChild(n): accoda un nodo n alla lista dei figli del nodo corrente
removeChild(n): rimuove un nodo n dalla lista dei figli del nodo corrente
replaceChild(n,o): sostituisce un nodo figlio o con un nuovo nodo n
insertBefore(n,r): inserisce un nodo n nella lista dei figli, posizionandolo
prima di un particolare figlio r
E. TINELLI – LTW A. A. 20112011-2012
9
Alcune primitive DOM (2)
• Document eredita da node tutte le funzionalità utili alla manipolazione
dei suoi nodi
• Document rappresenta il documento XML, i suoi figli sono la radice del
documento e tutti gli elementi, attributi, commenti e le processing
instruction che lo seguono
– getDocumentElement() - preleva direttamente il nodo radice del documento XML
– createX() – crea i nodi X da inserire nel documento
• Gli oggetti Element rappresentano i nodi di tipo elemento
– L’attribito tagName restituisce il nome del tag corrispondente
• Rispetto ai Node, gli Element dispongono di metodi e attributi per la
manipolazione degli attributi:
– getElementsByTagName restituisce i soli figli del nodo che siano elementi con uno
specifico nome
– normalize serve a fondere nodi Text adiacenti nel sottoalbero controllato
dall’elemento
E. TINELLI – LTW A. A. 20112011-2012
10
Alcune primitive DOM (3)
• L’interfaccia per la manipolazione degli attributi fornita da Element
comprende:
– getAttribute(s): restituisce il valore dell’attributo s
– setAttribute(s,v): crea l’attributo s e imposta il suo valore a s, o aggiorna il valore di s
se già esistente.
– removeAttribute(s): rimuove l’attributo s
– getAttributeNode, setAttributeNode, removeAttributeNode: come i precedenti,
ma usano oggetti Attr invece di stringhe
• Gli oggetti Attr rappresentano semplici attributi, con un name e un value:
– I valori per name e value sono accessibili anche attraverso i metodi getName e getValue
dell’interfaccia Node
• Vari metodi del DOM restituiscono liste:
– NodeList permette di gestire una lista ordinata di nodi
• length restituisce la lunghezza della lista
• item(i) restituisce l’i-esimo nodo della lista
– NamedNodeMap contiene elementi accessibili, oltre che per indice anche per nome
E. TINELLI – LTW A. A. 20112011-2012
11
JDOM
• Implementazione in java del modello DOM
– Collezioni di elementi ed attributi sono rappresentati usando
l’interfaccia java.util.List e l’oggetto Iterator (piuttosto che
NodeList del DOM)
• JDOM data model usa sia classi astratte che interfacce
• La classe astratta Content ha come sottoclassi Comment,
DocType, Element, EntityRef, ProcessingInstruction, Text
• L’interfaccia Parent descrive il comportamento comune di
nodi che possono avere contenuto
– È implementata da Document ed Element
E. TINELLI – LTW A. A. 20112011-2012
12
Esempio JDOM: raddoppiamo lo zucchero
E. TINELLI – LTW A. A. 20112011-2012
13
Esempio JDOM: parsing e serializzazione
•
JDOM non ha un parser definito ma si interfaccia con quelli preesistenti (DOM o
SAX). Il default è JAXP SAX parser senza validazione
–
è possibile validare solo durante il parsing (diversamente da DOM)
E. TINELLI – LTW A. A. 20112011-2012
14
Esempio JDOM: parser validante (DTD)
E. TINELLI – LTW A. A. 20112011-2012
15
Esempio JDOM: parser validante (XSD)
E. TINELLI – LTW A. A. 20112011-2012
16
SAX API
• A partire dalla versione 2, esistono versioni di SAX utilizzabili
anche in altri ambienti di programmazione (ad esempio nella
libreria msxml di Microsoft)
• Le API di SAX permettono di leggere e interpretare
documenti XML
• Funzionamento parser SAX: mentre legge (e valida) il
documento XML, richiama una serie di metodi callback che
segnalano il riconoscimento dei vari elementi del
documento, come gli elementi e il testo, in modo che il
codice possa agire di conseguenza
E. TINELLI – LTW A. A. 20112011-2012
17
SAX: Gestione degli eventi
• Gli eventi generati dal parser SAX segnalano:
–
–
–
–
–
L’inizio e la fine del documento;
L’apertura e la chiusura di un elemento;
L’apertura e la chiusura di una sezione CDATA;
L’inizio e la fine dello scope di ogni namespace;
La lettura di caratteri, PI, spazi non significativi
• Per ricevere le notifiche dal parser SAX, il codice deve passare al
metodo parse, oltre alla risorsa da cui leggere il documento, anche
un oggetto che estenda la classe org.xml.sax.helpers.DefaultHandler:
– Questa classe base contiene implementazioni di default per varie interfacce,
tra cui ContentHandler ed ErrorHandler, che il programmatore può
sovrascrivere per inserire la propria logica.
– Anche il parser DOM può utilizzare la parte di error handling fornita dal
DefaultHandler attraverso una chiamata a setErrorHandler
E. TINELLI – LTW A. A. 20112011-2012
18
SAX: Tracciare gli eventi (1)
E. TINELLI – LTW A. A. 20112011-2012
19
SAX: Tracciare gli eventi (2)
E. TINELLI – LTW A. A. 20112011-2012
20
Output del DefaultHandler applicato a recipes.xml
E. TINELLI – LTW A. A. 20112011-2012
21
SAX: calcolare la profondità di un albero XML
E. TINELLI – LTW A. A. 20112011-2012
22
SAX: vantaggi e svantaggi
• Il parser SAX è molto leggero, versatile e veloce
– Il parser SAX non costruisce documenti XML né conserva alcuna
struttura in memoria dopo il parsing
– Il consumo di memoria è minimo, e si possono leggere documenti di
qualsiasi dimensione, anche molto più grandi della memoria
disponibile.
• Il programmatore deve scrivere il codice per interfacciarsi col parser e
gestire gli eventi nella maniera appropriata per l’applicazione
– Il codice da scrivere può essere lungo e ripetitivo
– Il programmatore può però implementare solo i gestori di eventi che
gli sono utili e ignorare gli altri.
• Ovviamente è sconsigliabile l’uso di SAX quando i documenti devono
subire manipolazioni
E. TINELLI – LTW A. A. 20112011-2012
23
Riferimenti
• Specifiche
– http://www.w3.org/DOM/
– http://www.jdom.org/
– http://www.saxproject.org/
• Testi consigliati
– A. Moller and M. Schwartzbach, An Introduction to XML and Web
Technologies, Addison Wesley, 2006 [cap. 7]
– H. M. and P.J.Deitel, T. R. Nieto, T. M. Linand P. Sadhu, XML
Corso di programmazione, Apogeo, 2002 [cap. 8-9]
E. TINELLI – LTW A.A. 20112011-2012
24