Presentazione 8.1 Document Type Definition per XML Informatica Generale (Prof. Luca A. Ludovico) Un documento XML <?XML version=“1.0”> <books> <book> <entry isbn=“1-55860-622-X”> <title>Data on the Web:...</title> <publisher>Morgan Kaufmann</publisher> </entry> <author>Serge Abiteboul</author> <bookRef to=“0-201-53771-O 1-55860-463-4”/> <articleLink href=“http://…/articles.xml#id(Abi97)”/> </book> <book> <entry isbn=“0-201-53771-O”> <title>Foundation of Databases</title> <publisher>Addison Wesley</publisher> </entry> <author>Serge Abiteboul</author> ... </book> ... </books> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Tipi di Documento • Idea base: associare un tipo al documento XML • Un documento XML contiene informazione codificata secondo le regole sintattiche dell’XML. – Vedi presentazione 7.1 • Un tipo di documento rappresenta una classe di documenti con una struttura ed una semantica simile • Esempi: articoli di giornale, ricette di cucina, note, partiture, … Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Document Type Definition (DTD) • Il/la Document Type Definition (definizione del tipo di documento) fornisce un significato standard per descrivere dichiarativamente la struttura di un tipo di documento. • Lo scopo è definire le componenti ammesse nella costruzione di un documento XML. Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Cosa fa un DTD • Definisce: – gli elementi leciti all'interno del documento. Non si possono usare altri elementi se non quelli definiti; – la struttura di ogni elemento, ossia cosa può contenere ciascun elemento, l'ordine, la quantità di elementi che possono comparire e se sono opzionali o obbligatori; – una serie di attributi per ogni elemento e che valori possono o devono assumere questi attributi. • Fornisce infine alcuni meccanismi per semplificare la gestione del documento, come la possibilità di dichiarare entity e la possibilità di importare parti di altri DTD. Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 DTD • Un DTD è logicamente composto da due parti: 1. Element Type Definition 2. Attribute List Declaration Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Element Type Definition (1/2) • La Element Type Definition specifica: – Struttura del documento – Contenuti consentiti (content model) Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Element Type Definition (2/2) • Ciascun elemento deve essere dichiarato in un DTD con definizioni di tipo di elemento. • Tali definizioni hanno la forma <!ELEMENT nome_elemento (modello di contenuto)> • Esempio (guardare solo la sintassi) <!ELEMENT armadio (vestito+)> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Modello di contenuto <!ELEMENT nome_elemento (modello di contenuto)> • All’interno del modello di contenuto vengono elencati gli eventuali sottoelementi. – La virgola , implica una sequenza di sotto-elementi – Il pipe | implica una scelta tra sotto-elementi • Cardinalità dei sotto-elementi (da specificare subito dopo il loro nome): – – – – Non specificata ? * + 1 e 1 solo 0o1 da 0 a molti da 1 a molti Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esempi di definizione di elementi Sintassi DTD: <!ELEMENT codice_isbn EMPTY> Elemento vuoto (empty content) In ogni file XML aderente a un DTD siffatto, troveremo: <codice_isbn/> oppure <codice_isbn></codice_isbn> Sintassi DTD: <!ELEMENT titolo (#PCDATA)> Elemento con testo semplice (simple content) In ogni file XML aderente a un DTD siffatto, troveremo: <titolo>Il mio titolo</titolo> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esempi di definizione di elementi Sintassi DTD: <!ELEMENT simbolo (nota | pausa)> Elementi con sottoelementi (element content) In un file XML aderente a un DTD così fatto, potremo trovare: <simbolo> <nota>…</nota> </simbolo> oppure <simbolo> <pausa>…</pausa> </simbolo> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esempi di definizione di elementi Sintassi DTD: <!ELEMENT libro (titolo, autore*, anno_pubblicazione?)> Elementi con sottoelementi (element content) In un file XML aderente a un DTD così fatto, potremo trovare: <libro> <titolo>Titolo del libro</titolo> <autore>Primo autore</autore> <autore>Secondo autore</autore> </libro> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esempi di definizione di elementi Sintassi DTD: <!ELEMENT annotazione (#PCDATA | nome | data)*> Elemento con contenuto misto (mixed content) In un file XML aderente a un DTD così fatto, potremo trovare: <annotazione>Oggi appuntamento con <nome>Luca</nome> alle 15.30</annotazione> <annotazione>Il <data>15/10/2010</data> appuntamento con il Dott. <nome>Antonio Rossi</nome></annotazione> Cosa sarebbe successo omettendo nella sintassi del DTD l’asterisco? Cosa sarebbe successo scegliendo una virgola al posto del pipe? Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Attribute-List Declaration • E’ la lista (opzionale) degli (eventuali) attributi permessi o richiesti per ogni elemento. • Ogni attributo è specificato da: nome, tipo, e altre informazioni. • Le dichiarazioni degli attributi hanno la forma: <!ATTLIST nome_elemento nome_attributo1 (tipo) valori_predefiniti … nome_attributoN (tipo) valori_predefiniti> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Tipi di attributo <!ATTLIST nome_elemento nome_attributo1 (tipo) valori_predefiniti … nome_attributoN (tipo) valori_predefiniti> • Si hanno tre gruppi di tipi di attributo: – string types ossia stringhe di tipo CDATA; – enumerated types per i quali viene indicata una serie di valori validi fra cui scegliere; – tokenized types indicati da token dichiarati quali ID, IDREF e IDREFS. Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esempi con tipi tokenized • Attributi di tipo ID: quando si vuole che il valore dell’attributo sia univoco nel documento XML. Ad esempio: – <studente matricola=“”>… – <scheda_anagrafica codice_fiscale=“”>… – <libro isbn=“”>… – Attributi di tipo IDREF: quando si vuole far riferimento a valori di attributi ID specificati nel documento XML. Ad esempio: – <voto_esame matricola=“”>… ove matricola fa riferimento a un valore immesso nella scheda anagrafica Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Valori predefiniti per gli attributi <!ATTLIST nome_elemento nome_attributo1 (tipo) valori_predefiniti … nome_attributoN (tipo) valori_predefiniti> • #REQUIRED Specifica che l'attributo è obbligatorio. • #IMPLIED L'attributo è facoltativo. • #FIXED Fornisce una dichiarazione di costante per il valore di un attributo. Se il valore nel documento è diverso da quello dichiarato nel DTD, il documento non è valido. Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esempi Sia dato ad esempio: <!ELEMENT Indirizzo EMPTY> (definizione di elemento) <!ATTLIST Indirizzo nome_via CDATA #REQUIRED> <!ATTLIST Indirizzo nome_via CDATA #REQUIRED n_civico CDATA #IMPLIED> <!ATTLIST Indirizzo n_civico CDATA #REQUIRED “1”> <!ATTLIST Indirizzo intestazione CDATA #FIXED “via”> <!ATTLIST Indirizzo intestazione (via|piazza) #REQUIRED> <!ATTLIST Indirizzo identificativo ID #REQUIRED> <!ATTLIST Indirizzo riferimento IDREF #IMPLIED> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Scheda di una raccolta di libri <?XML version="1.0"> <books> <book> <entry isbn="isbn_1-55860-622-X"> <title>Data on the Web:...</title> <publisher>Morgan Kaufmann</publisher> </entry> <author>Serge Abiteboul</author> <bookRef to="isbn_0-201-53771-O isbn_1-55860-463-4"/> <articleLink href="http://…/articles.xml#id(Abi97)"/> </book> <book> <entry isbn="isbn_0-201-53771-O"> <title>Foundation of Databases</title> <publisher>Addison Wesley</publisher> </entry> <author> Serge Abiteboul</author> <bookRef /> </book> ... </books> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 DTD di una raccolta di libri <!DOCTYPE Books[ <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT books(book)+> book(entry, author+, bookRef, articleLink*)> entry(title, publisher)> bookRef EMPTY> articleLink EMPTY> title (#PCDATA)> author (#PCDATA)> publisher (#PCDATA)> <!ATTLIST entry isbn ID #REQUIRED> <!ATTLIST bookRef to IDREFS #IMPLIED> <!ATTLIST articleLink xmlns:xlink CDATA #FIXED “http://w3c.org/xlink” xlink:type CDATA #FIXED “simple” xlink:href CDATA #REQUIRED> ]> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esercizio: dal DTD a un documento XML <!ELEMENT articolo (paragrafo+)> <!ELEMENT paragrafo (immagine*, testo+, codice*)> <!ELEMENT immagine EMPTY> <!ELEMENT testo (#PCDATA)> <!ELEMENT codice (#PCDATA)> <!ATTLIST articolo titolo CDATA #REQUIRED> <!ATTLIST paragrafo titolo CDATA #IMPLIED tipo (abstract|bibliografia|note) #IMPLIED > <!ATTLIST immagine file CDATA #REQUIRED> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Una possibile soluzione <?xml version="1.0" encoding="UTF-8"?> <articolo titolo="Il mio titolo"> <paragrafo titolo="paragrafo con immagini"> <immagine file="C:\pippo.jpg"/> <immagine file="C:\immagini\pluto.bmp"/> <testo>Questo è il paragrafo 1.</testo> </paragrafo> <paragrafo tipo="note"> <testo>Questo è il paragrafo 2...</testo> <testo>...e questo è altro testo.</testo> <codice>ABC-123_XYZ</codice> </paragrafo> </articolo> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esercizio: dal documento XML al DTD <?xml version="1.0"?> <libri aggiornamento="25/11/2009"> <libreria nome="Librissimi" indirizzo="Via Adda, 3" /> <libro codice="id0001"> <autore>J.K. Rowlings</autore> <titolo>Harry Potter e la pietra filosofale</titolo> <editore anno="1997">Salani</editore> </libro> <libro codice="id0002"> <autore>J.R. Tolkien</autore> <autore>J.R. Tolkien</autore> <titolo>Il signore degli Anelli</titolo> <editore>Bompiani</editore> <prezzo valuta="euro">24</prezzo> </libro> … </libri> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Una possibile soluzione <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT libri (libreria,libro+)> libreria EMPTY> libro (autore+,titolo,editore,prezzo?)> autore (#PCDATA)> titolo (#PCDATA)> editore (#PCDATA)> prezzo (#PCDATA)> <!ATTLIST libri aggiornamento CDATA #IMPLIED> <!ATTLIST libreria nome CDATA #REQUIRED indirizzo CDATA #IMPLIED> <!ATTLIST libro codice ID #REQUIRED> <!ATTLIST editore anno CDATA #IMPLIED> <!ATTLIST prezzo valuta CDATA #REQUIRED> In blu le scelte sulla cardinalità forzate dal testo. Le altre scelte risultano logiche ma non sono necessarie per la validità dell’XML contro questo DTD Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Esercizio Si crei un documento XML ben formato contenente le informazioni su un rivenditore di auto usate. • Il rivenditore dispone di più autovetture. • Le auto devono essere raggruppate per casa automobilistica tramite un’opportuna marcatura. • Ogni auto, infine, è caratterizzata da una targa, un colore, un anno di immatricolazione e un chilometraggio attuale (esprimibile in km o in miglia). • Il documento XML deve contenere almeno un attributo e almeno un elemento vuoto. • Si dia esempio di tale documento ipotizzando un totale di 3 auto, di cui due della stessa casa automobilistica. • Si scriva un DTD che generalizza il documento così creato. Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Soluzione: un documento XML <?xml version="1.0" encoding="UTF-8"?> <rivenditore> <casa nome="Fiat"> <auto> <targa>AB123CV</targa> <colore tonalità="rosso" /> <anno_immatricolazione>1987</anno_immatricolazione> <chilometraggio unita_misura="km">120000</chilometraggio> </auto> <auto> <targa>DB478CH</targa> <colore tonalità="blu" /> <anno_immatricolazione>2001</anno_immatricolazione> <chilometraggio unita_misura="km">56000</chilometraggio> </auto> </casa> <casa nome="Chrysler"> <auto> <targa>AC111JK</targa> <colore tonalità="grigio" /> <anno_immatricolazione>2005</anno_immatricolazione> <chilometraggio unita_misura="miglia">7000</chilometraggio> </auto> </casa> </rivenditore> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1 Soluzione: un possibile DTD <!ELEMENT rivenditore (casa+)> <!ELEMENT casa (auto+)> <!ELEMENT auto (targa, colore, anno_immatricolazione, chilometraggio)> <!ELEMENT targa (#PCDATA)> <!ELEMENT colore EMPTY> <!ELEMENT anno_immatricolazione (#PCDATA)> <!ELEMENT chilometraggio (#PCDATA)> <!ATTLIST casa nome CDATA #REQUIRED> <!ATTLIST colore tonalità CDATA #REQUIRED> <!ATTLIST chilometraggio unita_misura (km|miglia) #REQUIRED> Informatica Generale (Prof. Luca A. Ludovico) Presentazione 8.1