DTD
E N D
Presentation Transcript
DTD Laurea Magistrale in Informatica Chapter 03 Modulo del corso Thecnologies for Innovation
Agenda • DTD role • DTD Declaration • Sequences • Content Types • Attributes • Entities DTD
Ruolo del DTD DTD
DTD • Un DTD e’ un documento che definisce in modo formale, le regole di una classe di documenti XML • In un DTD si possono dichiarare: • Gli elementi utilizzabili, in che ordine e con quante occorrenze possono essere nidificati tra loro • Quali attributi sono applicabili a ciascun elemento, se sono obbligatori e quali sono i loro valori predefiniti • Le entità e le annotazioni utilizzabili all’interno del documento XML o del DTD stesso DTD
Perché usare una DTD • Gruppi indipendenti di persone possono accordarsi su un DTD comune per definire un formato per i dati • Un DTD puo’ essere usato per verificare la validita’ dei dati • Avvertenza: il DTD non e’ obbligatorio! DTD
Dichiarazione di un DTD Interna al documento XML: <!DOCTYPE root-element [element declarations]> Esterna al documento XML : <!DOCTYPE root-element SYSTEM “URI”> N.B.: In XML il nome del DOCTYPE deve essere il nome del tag radice. DTD
Dichiarazione di elemento • Per ogni tipo di elemento viene indicato il tipo di contenuto, che può essere: • Any content: indica che ogni contenuto è ammissibile.Es: <!ELEMENT memo ANY> • Empty content: un elemento vuoto non può contenere alcun testo tra il tag di inizio e quello di chiusura e può quindi essere rappresentato da un tag vuoto. Es: <!ELEMENT br EMPTY> • Simple content: è un elemento il cui contenuto è composto da testo. In questo caso #PCDATA è acronimo di “Parsed Character Data”.Es: <!ELEMENT message (#PCDATA)> • Element content: è il caso tipico in cui il contenuto è composto da sottoelementi.Es: <!ELEMENT note (to, from, title, message)> • Mixed content: sono elementi che contendono testo misto ad altri elementi DTD
Sequenze L’elemento , (chiamato sequenza) specifica l’ordine in cui debbono presentarsi gli elementi <!ELEMENT classe (insegnate,studente)> Specifica che l’elemento classe deve contenere un solo elemento insegnate seguito daun solo elemento studente L’elemento | (chiamato opzione) specifica le opzioni con cui debbono presentarsi gli elementi <!ELEMENT classe (insegnate|studente)> Specifica che l’elemento classe deve contenere l’elemento insegnate o l’elemento studente non entrambi L’elemento + (chiamato ricorrenza) specifica le frequenze di ripetizione con cui debbono presentarsi gli elementi <!ELEMENT classe (insegnate,studente+)> Specifica che l’elemento classe deve contenere un solo elemento insegnate seguito dapiù elementi studente DTD
Indicatori di ricorrenza <!ELEMENT libreria (libro*)> Specifica che l’elemento libreria può contenere un numero qualsiasi di elemento libro che può anche non essere utilizzato <!ELEMENT poltrona (persona?)> Specifica che l’elemento poltrona può contenere al massimo un elemento persona che può anche non essere utilizzato DTD
ESEMPI <!ELEMENT classe (numero, (istruttore | assistente+), (credito | nocredito) )> soluzione <!ELEMENT crostata (gelatina?, limone*,((crema | zucchero)+ | glassa))> soluzione <!ELEMENT fattoria (fattore+,(cane* | gatto?), maiale*, ( capra | mucca)?, (gallina+ | oca* ))> soluzione DTD
Contenuto misto • In XML il contenuto di testo #PCDATA ed il contenuto di elementi possono combinarsi solo nella forma seguente:<!ELEMENT para (#PCDATA | bold | italic)*> • Ogni paragrafo contiene un testo in cui si possono trovare, opzionalmente, degli elementi <bold> ed <italic>. Es: <para> <bold>Questo</bold> testo contiene delle sezioni in <bold>grassetto</bold> ed in <italic>corsivo</italic>, ma potrebbe anche non averne</para> DTD
EMPTY DTD
ANY DTD
Tipi di contenuto Documento DTD intro.dtd <!ELEMENT myMessage ( message )> Dichiara l’elemento myMessage come root con un unico child di nome message <!ELEMENT message ( #PCDATA )> Dichiara che l’elemento message deve contenere dati di caratteri riconosciuti dal parser XML Contenuto MISTO <!ELEMENT myMessage (#PCDATA | message )*> Dichiara l’elemento myMessage come root con contenuto misto MARKUP conforme alla dichiarazione <?xml version = "1.0"?> <!DOCTYPE myMessage SYSTEM "intro.dtd"> <myMessage> questo è un esempio; segue <message> altro test </message> e <message> altro testo ancora </message> </myMessage> L’elemento myMessage contiene due elementi message e due istanze di dati e caratteri Considerando la presenza dell’*, l’elemento myMessage potrebbe essere privo di contenuto Documento XML intro.xml <?xml version = "1.0"?> <!DOCTYPE myMessage SYSTEM "intro.dtd"> <myMessage> <message>Welcome to XML!</message> </myMessage> DTD
<?xml version = "1.0" ?><!-- Fig. 6.5: mixed.xml --><!-- Mixed content type elements --> <!DOCTYPE format [ <!ELEMENT format ( #PCDATA | bold | italic )*> <!ELEMENT bold ( #PCDATA )> <!ELEMENT italic ( #PCDATA )>]><format> This is a simple formatted sentence. <bold>I have tried bold.</bold> <italic>I have tried italic.</italic> Now what?</format> NOTARE LA SPECIFICA DELLA DTD INTERNA Esempio di tipo di contenuto mixed.xml DTD
Limitazioni DTD
Attributi • In generale gli attributi vengono specificati con ATTLIST:<!ATTLIST elemento attributo1 tipo1 modificatore1 attributo2 tipo2 modificatore2 attributo-n tipo-n modificatore-n> • I tipi definiscono l’insieme o la tipologia dei valori assumibili dall’attributo • I modificatori identificano le condizioni di obbligatorietà o opzionalità dell’attributo ed, eventualmente, un valore di default per lo stesso DTD
Sintassi per la dichiarazione di attributo • Possibili valori di attribute-type: • CDATA character data • (n1|n2|…) uno fra gli n1, n2, … • ID un identificatore unico • IDREF riferimento ad un ID • … DTD
Note DTD
Attributi stringa <!ATTLIST message lang CDATA “Italiano”> • In questo caso l’attributo lang è una stringa • Se l’attributo è presente nel file il suo valore è quello specificato • Altrimenti viene assunto il valore di default “Italiano” <note> … <message lang=“English”> Remember the meeting </message> </note> <note> … <message> Ricordati l’appuntamento </message> </note> DTD
Attributi per enumerazione <!ATTLIST person salutation (Mr | Mrs | Miss | Dr) “Mr”> • Il titolo di ogni persona assume valori nell’insieme indicato • In mancanza del parametro si assume per default “Mr” <person salutation=“Dr”> <name>Luke</name> <surname>Brown</name> </person> DTD
Modificatori • Valore di default: espresso da una stringa indica il valore da assegnare all’attributo in mancanza di diverse indicazioni • Valore fisso: definito da #FIXED più il valore. L’attributo assume obbligatoriamente il valore assegnato e l’autore del documento XML non può modificarlo:<!ATTLIST persona numeroGambe CDATA #FIXED “2”> • Specifica di obbligatorietà: #REQUIRED. Indica che l’attributo deve essere sempre presente in ogni elemento<!ATTLIST misura val CDATA #REQUIRED> • Specifica di opzionalità: #IMPLIED. Indica che l’attributo è opzionale e può non essere specificato dall’autore del documento. Se combinato con ID indica che il sistema genererà un identificativo automaticamente DTD
Entità • Le entità del DTD sono frammenti ricorrenti di contenuti testuali a cui vengono associati degli identificatori che possono essere “espansi” come macro all’interno del documento prima di procedere al parsing vero e proprio • La definizione avviene secondo lo schema: <!ENTITY nomeEntità valore> • L’utilizzo avviene inserendo nel testo la sequenza: &nomeEntità; • Esempio: <!ENTITY autore “Francesco De Angelis”> <document><title>Introduzione ad XML</title><author>&autore;</author> </document> DTD
Entità esterne • Le entità esterne vengono “recuperate” da un file esterno all’XML <!ENTITY nomeEntità SYSTEM “url del file”> • Es: <!ENTITY text SYSTEM “book.txt”> • E’ possibile specificare entità da non parsare, tipicamente come entità di dati binari <!ENTITY immagine SYSTEM “img.gif” NDATA gif> <book> <title>..</title> <text>&text;</text> </book> DTD
Entità predefinite • Sono predefinire tutte le entità associabili ai singoli caratteri sulla base del codice (unicode) degli stessi. Ad esempio l’entità corrisponde al carattere ASCII 10. • Alcuni caratteri, tra cui ‘<‘ ed ‘&’, creano problemi quando vengono mischiati al testo. Per questo sono predefinire alcune entità che possono sostituire questi caratteri: • Equivalente a : <![CDATA [<]]> DTD
Entità parametriche (I) • Sono entità definite nel DTD ed utilizzate all’interno del DTD stesso • Vengono sostituite durante la lettura del DTD • Contengono frammenti ricorrenti del modello di contenuto • Es: volendo definire in un unico punto il tipo di testo che contiene sezioni in grassetto: <!ENTITY % testo “#PCDATA”> <!ENTITY % testoConBold “(%testo;|bold)*”> <!ELEMENT testo %testoConBold;> DTD
Entità Parametriche (II) <!ENTITY % common " size (small | medium | large) 'medium' color (red | blue | green | black | white) "'white' price CDATA #REQUIRED"> <!ELEMENT shirt (#PCDATA)> <!ELEMENT pants (#PCDATA)> <!ELEMENT skirt (#PCDATA)> <!ATTLIST shirt %common;> <!ATTLIST pants %common;> <!ATTLIST skirt %common;> DTD
Cosa c’è di sbagliato nelle DTD • Troppo “document oriented” • DTD è stato sviluppato per interfacciarsi con tool per il trattamento del testo • Limitato nella rappresentazione di strutture complesse • Non c’è la nozione di ereditarietà/sub-typing • Content-model ambiguo • Troppi modi per rappresentare la stessa cosa • I nomi sono globali, non locali DTD
Utilizzo delle DTD • Validazione • Storage XML efficiente (persistenza, estensione, o database storage) • Documentazione • Parsing efficiente • Design di tool di supporto DTD
Case Study: Agenda giornalieraDefinizione degli elementi DTD
fine DTD
Soluzione 1 L’elemento classedeve contenere un elemento numero, un elemento istruttore oppure un numero qualsiasi di elementi assistente e un elemento credito o un elemento nocredito, <!ELEMENT classe (numero, (istruttore | assistente+), (credito | nocredito) )> DTD
Soluzione 2 L’elemento crostatapuò avere o non avere l’elemento gelatina, seguito da zero o più elementi limone, uno o più elementi crema o zucchero, oppure un solo elemento glassa <!ELEMENT crostata (gelatina?, limone*,((crema | zucchero)+ | glassa))> DTD
Soluzione 3 L’elemento fattoriadeve avere almeno un elemento fattore, può avere un numero qualsiasi di elementi facoltativi cane o un elemento facoltativo gatto, un numero qualsiasi di elementi facoltativi maiale, un elemento facoltativo capra o mucca e uno o più elementi gallina oppure un numero qualsiasi di elementi facoltativi oca. <!ELEMENT fattoria (fattore+,(cane* | gatto?), maiale*, ( capra | mucca)?, (gallina+ | oca* ))> DTD