1 Sistemi Informativi e Servizi in Rete Università degli Studi di Brescia Facoltà di Ingegneria...
-
Upload
croccifixio-casagrande -
Category
Documents
-
view
212 -
download
0
Transcript of 1 Sistemi Informativi e Servizi in Rete Università degli Studi di Brescia Facoltà di Ingegneria...
1
Sistemi Informativi e Servizi in Rete
Università degli Studi di Brescia
Facoltà di Ingegneria
Parsing di documenti XML
2Sistemi Informativi e Servizi in Rete
XML parsing
Sommario
• Definizione e tipologie di parser XML
• Simple API for XML (SAX)
• Document Object Model (DOM)
3Sistemi Informativi e Servizi in Rete
XML parsing
Che cos’è un parser XML?
• Il parser XML è un’applicazione che:
recupera il documento XML carica i dati in memoria presenta all’applicazione che lo invoca un’interfaccia di alto livello fornisce servizi di validazione (opzionale) fornisce servizi di ricerca (opzionale)
4Sistemi Informativi e Servizi in Rete
XML parsing
Che cos’è un parser XML?
XMLDTD
XML parser
Applicazione
XSD
5Sistemi Informativi e Servizi in Rete
XML parsing
Parsing di documenti XML
• Due diversi approcci
approccio ad eventi
» il parser scandisce l’intero documento XML
» ogni volta che incontra un nuovo elemento, informa l’applicazione usando la tecnica del Callback
approccio basato su modello» il parser costruisce internamente una struttura ad
albero che rappresenta il documento XML (albero sintattico)
» fornisce all’applicazione delle API che permettono la navigazione dell’albero sintattico
6Sistemi Informativi e Servizi in Rete
XML parsing
Approccio ad eventi
<Libro disponibilità=“S”> <Titolo>Il Signore degli Anelli</Titolo> <Autore>J.R.R. Tolkien</Autore> <Data>2002</Data> <ISBN>88-452-9005-0</ISBN> <Editore>Bompiani</Editore></Libro>
XML Parser
Applicazione
Libro Titolo Autore…
t
7Sistemi Informativi e Servizi in Rete
XML parsing
Approccio basato su modello
<Libro disponibilità=“S”> <Titolo>Il Signore degli Anelli</Titolo> <Autore>J.R.R. Tolkien</Autore> <Data>2002</Data> <ISBN>88-452-9005-0</ISBN> <Editore>Bompiani</Editore></Libro>
XML Parser
Applicazione
Libro disponibilità=“…”
Titolo
attr
Editore
8Sistemi Informativi e Servizi in Rete
XML parsing
Approccio ad eventi Approccio basato su modello
• E’ molto “leggero”
• Il programmatore può implementare solo le funzionalità
necessarie
• Fornisce all’applicazione un modello ricco del documento
• Mantiene una rappresentazione completa e durevole in memoria
• Interfaccia troppo semplice; si
richiede più codice nell’applicazione
• Nessun supporto per operare sul documento
• Richiede un'occupazione di
memoria per tutto il documento
9Sistemi Informativi e Servizi in Rete
XML parsing
JAXP
• Java API for XML Processing (JAXP)
• Supporto standard della SUN per l’elaborazione di documenti XML
• Propone due implementazioni:– SAX (Simple API for XML) ad eventi– DOM (Document Object Model) basato su una
rappresentazione interna dell’albero sintattico
10Sistemi Informativi e Servizi in Rete
XML parsing
Sommario
• Definizione e tipologie di parser XML
• Simple API for XML (SAX)
• Document Object Model (DOM)
11Sistemi Informativi e Servizi in Rete
XML parsing
SAX
• Simple API for XML
• Nasce come API alternativa al DOM per l’ambiente Java successivamente adottato anche al di fuori del mondo
Java (e.g., Microsoft)
• Basa il suo sistema di parsing sugli eventi inizio di un documento apertura e chiusura di un elemento apertura e chiusura di un blocco CDATA ingresso ed uscita dallo scope di un namespace fine del documento
12Sistemi Informativi e Servizi in Rete
XML parsing
Architettura SAX
Applicazione
Listener
Handler
Parser
Registra Listener
(1)
IniziaScansione
(2)
XML
Iniziodoc, inizioelem,..(3)
13Sistemi Informativi e Servizi in Rete
XML parsing
L’Handler del SAX (1)
• L’applicazione deve implementare l’interfaccia org.xml.sax.helpers.ContentHandler
interface ContentHandler {void startDocument(); void startElement(String namespaceURI, String localName, String qName, Attributes atts);void startPrefixMapping(String prefix, String uri);void characters(char[] ch, int start, int length);void endDocument(); void endElement(String namespaceURI,String localName, String qName);void endPrefixMapping(String prefix);void ignorableWhitespace(char[] ch, int start, int length);void processingInstruction(String target, String data);
}
14Sistemi Informativi e Servizi in Rete
XML parsing
L’Handler del SAX (2)
• La classe DefaultHandler implementa l’interfaccia permettendo all’applicazione di ridefinire (override) solo i metodi desiderati
15Sistemi Informativi e Servizi in Rete
XML parsing
L’Handler del SAX (2)
• La classe DefaultHandler implementa l’interfaccia permettendo all’applicazione di ridefinire (override) solo i metodi desiderati
16Sistemi Informativi e Servizi in Rete
XML parsing
Parser SAX: i package
• I package da importare sono i seguenti
17Sistemi Informativi e Servizi in Rete
XML parsing
Elaborare un documento XML con SAX (II)
• Per elaborare un documento XML con SAX è prima di tutto necessario istanziare un oggetto SAXParseFactory
18Sistemi Informativi e Servizi in Rete
XML parsing
Elaborare un documento XML con SAX (II)
19Sistemi Informativi e Servizi in Rete
XML parsing
Elaborare un documento XML con SAX (III)
• Prima di utilizzare il parser è possibile settare le sue proprietà e le sue features
– settare una feature significa abilitare/disabilitare alcune funzionalità del parser (per esempio, l'uso dei namespace o la validazione tramite DTD o XSD)
– settare una proprietà significa modificare il valore di elementi su cui il parser opera (per esempio, l'URL dell'XSD da utilizzare per la validazione)
20Sistemi Informativi e Servizi in Rete
XML parsing
Settare le features del parser SAX (I)
• L'istruzione seguente abilita la validazione (spf è istanza di SAXParserFactory)
• L'istruzione seguente abilita l'utilizzo dei namespace
• Il metodo getFeature(String name) recupera le impostazioni settate
• Per un elenco delle features disponibili, si veda http://xerces.apache.org/xerces-j/features.html
21Sistemi Informativi e Servizi in Rete
XML parsing
Settare le features del parser SAX (II)
• La validazione e l'utilizzo dei namespace possono essere abilitati anche attraverso dei metodi ad-hoc della classe SAXParserFactory
• Le proprietà si gestiscono in modo simile con i seguenti metodi
• Per un elenco delle proprietà disponibili, si veda http://xerces.apache.org/xerces-j/properties.html
22Sistemi Informativi e Servizi in Rete
XML parsing
Validare un documento XML con un parser SAX (I)
• La validazione avviene ridefinendo i metodi per la gestione degli errori nel parser e settando le opportune features e proprietà quando si invoca il parser
23Sistemi Informativi e Servizi in Rete
XML parsing
Validare un documento XML con un parser SAX (I)
• La validazione avviene ridefinendo i metodi per la gestione degli errori nel parser e settando le opportune features e proprietà quando si invoca il parser
24Sistemi Informativi e Servizi in Rete
XML parsing
Metodi per la gestione degli errori
• void error(SAXParserException exception)
– non interrompe il processo di parsing
• void fatalError(SAXParserException exception)
– interrompe il processo di parsing
• void warning(SAXParserException exception)
• Si tratta di metodi dell'interfaccia ErrorHandler, implementata sempre in DefaultHandler
• La classe SAXParserException presenta il metodo int getLineNumber() restituisce il numero di riga dove si è verificato l'errore
25Sistemi Informativi e Servizi in Rete
XML parsing
Metodi per la gestione degli errori
26Sistemi Informativi e Servizi in Rete
XML parsing
Settare il parser SAX per la validazione
27Sistemi Informativi e Servizi in Rete
XML parsing
Sommario
• Definizione e tipologie di parser XML
• Simple API for XML (SAX)
• Document Object Model (DOM)
28Sistemi Informativi e Servizi in Rete
XML parsing
DOM
• E’ una API per il parsing di documenti XML
• Definisce una modalità di rappresentazione di documenti XML
• Usa strutture dati accessibili dall’applicazione
• Definisce le operazioni per agire sulla rappresentazione intermedia caricamento della struttura
costruzione di un nuovo documento
navigazione dell’albero sintattico
aggiungere, eliminare, modificare e spostare le componenti
• Esistono implementazioni di DOM per diversi linguaggi di programmazione linguaggi server-side: Java, C++, C#
linguaggi di script: VB-script, Javascript
29Sistemi Informativi e Servizi in Rete
XML parsing
La struttura di DOM
• I documenti XML sono caricati sotto forma di albero sintattico, composto da oggetti di tipo Node ogni nodo può avere uno o più figli
• DOM definisce solo la vista logica e non dice nulla sull’effettiva struttura in memoria
• Come modello ad oggetti si specificano gli oggetti utilizzati per rappresentare il documento ed i suoi costituenti
le interfacce pubbliche degli oggetti per poter essere utilizzate dal livello applicativo
le relazioni tra gli oggetti e le interfacce
la semantica associata ad ogni classe
30Sistemi Informativi e Servizi in Rete
XML parsing
Esempio di DOM
<sentence> The &projectName; project is important <name>MAIS project</name> <typology>MIUR FIRB</typology></sentence>
+ ELEMENT: sentence + TEXT: The + ENTITY REF: projectName + TEXT: project is important + ELEMENT: name + TEXT: MAIS project + ELEMENT: typology + TEXT: MIUR FIRB
31Sistemi Informativi e Servizi in Rete
XML parsing
Caricamento di un DOM
• Il DOM di JAXP è definito nel package org.w3c.dom interfaccia standard che si appoggia su implementazioni differenti
(SUN, Apache, Oracle)
l’implementazione di SUN è nel package javax.xml.parsers
import org.w3c.dom.*;import javax.xml.parsers.*;import org.xml.sax.*;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse("libro.xml");
Definizione DOM standardImplementazione
di JAXPDOM usa SAX
32Sistemi Informativi e Servizi in Rete
XML parsing
Settare le proprietà del parser DOM
• void setIgnoringComments(boolean option)
– il parser ignora i commenti nel file XML
• void setIgnoringElementContentWhiteSpace(boolen option)
– il parser ignora gli spazi bianchi nel contenuto degli elementi
• void setNamespaceAware(boolean option)
• void setValidating(boolean option)
• Esistono inoltre i metodi per recuperare le opzioni di settaggio: isIgnoringComments(), isIgnoringElementContentWhitespace(), isNamespaceAware(), isValidating()
33Sistemi Informativi e Servizi in Rete
XML parsing
Navigazione di un documento
• Estrazione del nodo radice e stampa del nome del nodo
• Nodi figli
• Attributi
Element root = doc.getDocumentElement();System.out.println(root.getNodeName());
NodeList children = root.getChildNodes();for (int i = 0; i < children.getLength(); i++) System.out.println(children.item(i).getNodeName);
NamedNodeMap map = root.getAttributes();for (int i = 0; i < map.getLength(); i++) System.out.println(map.item(i).getNodeName());
34Sistemi Informativi e Servizi in Rete
XML parsing
Tipizzazione in DOM
n.getNodeType() == n.ELEMENT_NODE
Tipo di nodo nodeName nodeValue attributesElement Nome del tag null NamedNodeMap
Attr Nome dell’attributo Valore dell’attributo null
Text “#text” Testo associato null
CDATASection “#cdata-section” Testo associato null
EntityReference Nome dell’entità null null
Entity Nome dell’entità null null
ProcessingInstruction Valore dell’attributo target Contenuto escluso l’attributo target null
Comment “#comment” Testo associato Null
Document “#document” null Null
DocumentType Nome del tipo di documento null Null
DocumentFragment “#document-fragment” Null Null
Notation Nome della NOTATION null Null
35Sistemi Informativi e Servizi in Rete
XML parsing
Validazione in DOM
• La validazione segue le stesse regole viste per il parser SAX
• Una volta abilitata, la validazione di default avviene sulla base del DTD, a meno che non si usi la seconda istruzione appena mostrata
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schema);
36Sistemi Informativi e Servizi in Rete
XML parsing
Gestione degli errori in DOM
• DOM eredita la gestione degli errori di SAX
• Deve essere definito un handler che implementa l'ErrorHandler e in cui sono definiti i tre metodi error, fatalError e warning, a cui si passa un'istanza di SAXParserException
• Il parser DOM deve essere registrato come listener per gli eventi che segnalano un errore
Class Handler implements ErrorHandler...
builder.setErrorHandler(new Handler());
37Sistemi Informativi e Servizi in Rete
XML parsing
Esempio: navigazione e stampa (I)
38Sistemi Informativi e Servizi in Rete
XML parsing
Esempio: navigazione e stampa (II)
39Sistemi Informativi e Servizi in Rete
XML parsing
Esempio: navigazione e stampa (II)
40Sistemi Informativi e Servizi in Rete
XML parsing
Modifica del DOM
• DOM consente di inserire nuovi nodi nell'albero sintattico
Element root = doc.getDocumentElement();Element cap = doc.createElement("capitolo");cap.setAttribute("titolo", "Introduzione");cap.appendChild(doc.createTextNode("... testo ..."));Node capitolo = doc.getElementsByTagNameNS("http://www.elet.polimi.it", "capitolo").item(0);root.insertBefore(cap, capitolo);doc.normalize();
Creazione del nodo
Creazione dell’attributo
Ricerca del primo capitolo presente
Inserimentonormalizzazione. Es: unisce
nodi di testo consecutivi