1 Sistemi Informativi e Servizi in Rete Università degli Studi di Brescia Facoltà di Ingegneria...

Post on 03-May-2015

212 views 0 download

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