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