1 Sistemi Informativi e Servizi in Rete Università degli Studi di Brescia Facoltà di Ingegneria Parsing di documenti XML
2 XML parsing Sistemi Informativi e Servizi in Rete Sommario Definizione e tipologie di parser XML Simple API for XML (SAX) Document Object Model (DOM)
3 XML parsing Sistemi Informativi e Servizi in Rete 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)
4 XML parsing Sistemi Informativi e Servizi in Rete Che cos’è un parser XML? XMLDTD XML parser Applicazione XSD
5 XML parsing Sistemi Informativi e Servizi in Rete 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
6 XML parsing Sistemi Informativi e Servizi in Rete Approccio ad eventi Il Signore degli Anelli J.R.R. Tolkien Bompiani XML Parser Applicazione LibroTitolo Autore … t
7 XML parsing Sistemi Informativi e Servizi in Rete Approccio basato su modello Il Signore degli Anelli J.R.R. Tolkien Bompiani XML Parser Applicazione Librodisponibilità=“…” Titolo attr Editore
8 XML parsing Sistemi Informativi e Servizi in Rete Approccio ad eventiApproccio 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
9 XML parsing Sistemi Informativi e Servizi in Rete 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
10 XML parsing Sistemi Informativi e Servizi in Rete Sommario Definizione e tipologie di parser XML Simple API for XML (SAX) Document Object Model (DOM)
11 XML parsing Sistemi Informativi e Servizi in Rete 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
12 XML parsing Sistemi Informativi e Servizi in Rete Architettura SAX Applicazione Listener Handler Parser Registra Listener (1) Inizia Scansione (2) XML Iniziodoc, inizioelem,.. (3)
13 XML parsing Sistemi Informativi e Servizi in Rete 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); }
14 XML parsing Sistemi Informativi e Servizi in Rete L’Handler del SAX (2) La classe DefaultHandler implementa l’interfaccia permettendo all’applicazione di ridefinire (override) solo i metodi desiderati
15 XML parsing Sistemi Informativi e Servizi in Rete L’Handler del SAX (2) La classe DefaultHandler implementa l’interfaccia permettendo all’applicazione di ridefinire (override) solo i metodi desiderati
16 XML parsing Sistemi Informativi e Servizi in Rete Parser SAX: i package I package da importare sono i seguenti
17 XML parsing Sistemi Informativi e Servizi in Rete Elaborare un documento XML con SAX (II) Per elaborare un documento XML con SAX è prima di tutto necessario istanziare un oggetto SAXParseFactory
18 XML parsing Sistemi Informativi e Servizi in Rete Elaborare un documento XML con SAX (II)
19 XML parsing Sistemi Informativi e Servizi in Rete 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)
20 XML parsing Sistemi Informativi e Servizi in Rete 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
21 XML parsing Sistemi Informativi e Servizi in Rete 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
22 XML parsing Sistemi Informativi e Servizi in Rete 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
23 XML parsing Sistemi Informativi e Servizi in Rete 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
24 XML parsing Sistemi Informativi e Servizi in Rete 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
25 XML parsing Sistemi Informativi e Servizi in Rete Metodi per la gestione degli errori
26 XML parsing Sistemi Informativi e Servizi in Rete Settare il parser SAX per la validazione
27 XML parsing Sistemi Informativi e Servizi in Rete Sommario Definizione e tipologie di parser XML Simple API for XML (SAX) Document Object Model (DOM)
28 XML parsing Sistemi Informativi e Servizi in Rete 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
29 XML parsing Sistemi Informativi e Servizi in Rete 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
30 XML parsing Sistemi Informativi e Servizi in Rete Esempio di DOM The &projectName; project is important MAIS project MIUR FIRB + ELEMENT: sentence + TEXT: The + ENTITY REF: projectName + TEXT: project is important + ELEMENT: name + TEXT: MAIS project + ELEMENT: typology + TEXT: MIUR FIRB
31 XML parsing Sistemi Informativi e Servizi in Rete 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 standard Implementazione di JAXP DOM usa SAX
32 XML parsing Sistemi Informativi e Servizi in Rete 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()
33 XML parsing Sistemi Informativi e Servizi in Rete 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());
34 XML parsing Sistemi Informativi e Servizi in Rete Tipizzazione in DOM n.getNodeType() == n.ELEMENT_NODE Tipo di nodonodeNamenodeValueattributes ElementNome del tagnullNamedNodeMap AttrNome dell’attributoValore dell’attributonull Text“#text”Testo associatonull CDATASection“#cdata-section”Testo associatonull EntityReferenceNome dell’entitànull EntityNome dell’entitànull ProcessingInstructionValore dell’attributo targetContenuto escluso l’attributo targetnull Comment“#comment”Testo associatoNull Document“#document”nullNull DocumentTypeNome del tipo di documentonullNull DocumentFragment“#document-fragment”Null NotationNome della NOTATIONnullNull
35 XML parsing Sistemi Informativi e Servizi in Rete 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(" " factory.setAttribute(" schema);
36 XML parsing Sistemi Informativi e Servizi in Rete 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());
37 XML parsing Sistemi Informativi e Servizi in Rete Esempio: navigazione e stampa (I)
38 XML parsing Sistemi Informativi e Servizi in Rete Esempio: navigazione e stampa (II)
39 XML parsing Sistemi Informativi e Servizi in Rete Esempio: navigazione e stampa (II)
40 XML parsing Sistemi Informativi e Servizi in Rete 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(" "capitolo").item(0); root.insertBefore(cap, capitolo); doc.normalize(); Creazione del nodo Creazione dell’attributo Ricerca del primo capitolo presente Inserimento normalizzazione. Es: unisce nodi di testo consecutivi