XML: DTD Da un punto di vista cronologico, il primo approccio per la definizione di grammatiche per documenti XML è rappresentato dai Document Type Definition (DTD). Un DTD è un documento che descrive i tag utilizzabili in un documento XML, la loro reciproca relazione nei confronti della struttura del documento ed altre informazioni sugli attributi di ciascun tag. La sintassi di un DTD si basa principalmente sulla presenza di quattro dichiarazioni: <!ELEMENT> <!ATTLIST> <!ENTITY> <!NOTATION>
XML: DTD Il DTD è OPZIONALE ed è un insieme di regole per definire la struttura di un documento XML. Queste regole definiscono quali elementi possono e/o devono essere usati nel documento quali attributi si possono usare per ogni elemento inoltre impongono dei vincoli sulle relazioni tra elementi
XML: DTD I DTD sono utili per chi deve intepretare il documento XML (programmatori o parser) sono utili per definire fogli di stile sono utili per verificare la validità di un documento XML sono utili per creare interfacce dinamiche per documenti XML sono utili per l'interscambio di documenti
XML: DTD I DTD possono essere considerati con una struttura ad albero: I nodi rappresentano elementi ed attributi Gli archi rappresentano le relazioni elemento/sottoelemento o elemento/attributo
XML: DTD I DTD possono essere interni o esterni, (anche misto). Un DTD esterno ha il vantaggio di poter essere più facilmente condiviso e riutilizzato. Viene generalmente utilizzato da organizzazioni che hanno la necessità di rendere standard la struttura logica dei documenti: W3C <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> Un DTD interno è contenuto all'interno del documento XML stesso.
XML: DTD <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>pippo</to> <from>pluto</from> <heading>reminder</heading> <body>ricordati di chiamare Paperino</body> </note>
XML: DTD <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>pippo</to> <from>pluto</from> <heading>reminder</heading> <body>ricordati di chiamare Paperino</body> </note> <?xml version="1.0" encoding="utf-8"?> <!ELEMENT note (to, from, heading, body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
XML: DTD <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> PUBLIC se il DTD esterno è uno standard SYSTEM se il DTD esterno è personale Si usa il carattere + per indicare che il DTD è riconosciuto da un'organismo di controllo per gli standard (es. ISO), - nel caso in cui non lo sia. //proprietario//dtd_descr//lingua URL del DTD
XML: DTD Secondo le specifiche W3C i parser NON TOLLERANO ERRORI, quindi possono fermarsi al primo errore che incontrano nell'analisi del documento XML. Questa scelta è stata fatta per rendere i parser semplici da implementare e per la natura stessa di XML (compatibilità ed indipendenza dalla piattaforma e dal parser). I parser HTML sono molto meno restrittivi come abbiamo già visto, rendendoli notevolmente più complessi ed incompatibili tra loro. Gli errori che i parser possono incontrare durante l'analisi sono: FATAL ERROR ERROR
XML: DTD Una violazione di un vincolo espresso in un DTD viene considerata ERROR, mentre una violazione di una regola di buona formattazione viene considerata un FATAL ERROR Secondo le specifiche un fatal error è più grave di un error. FATAL ERROR: il parser può continuare l'analisi del documento per cercare altri errori ma non deve continuare a fornirne il contenuto del documento all'applicazione. ERROR: il parser può continuare l'analisi del documento per cercare altri errori e può continuare a fornirne il contenuto del documento all'applicazione, è compito di quest'ultima decidere cosa fare (ignorarlo, segnalarlo etc...)
XML: DTD RIASSUMENDO, un DTD dichiara: NOME degli elementi permessi CONTENUTO di ogni tipo di elemento STRUTTURA del documento (ordine e sequenze) PROPRIETA' degli elementi (attributi) ENTITA' (sostituzioni)
XML: DTD ELEMENTS OPERATORI ORDINALI, sequenza scelta OPERATORI CARDINALI + indica che l'elemento è presente una o più volte * indica che l'elemento è presente zero o più volte? indica che l'elemento è presente zero o una sola volta
XML: DTD ELEMENTS <!ELEMENT Frutta (Fragole, (Mele Arance))> <Frutta> <Fragole>...</Fragole> <Mele>...</Mele> </Frutta> <Frutta> <Fragole>...</Fragole> <Arance>...</Arance> </Frutta>
XML: DTD ELEMENTS <!ELEMENT Frutta (Fragole+, (Mele Arance)*)> <Frutta> <Fragole>...</Fragole> <Fragole>...</Fragole> <Mele>...</Mele> <Arance>...</Arance> <Arance>...</Arance> </Frutta>
XML: DTD ELEMENTS Per la definizione dei tag che non contengono sottoelementi dobbiamo distinguere il caso dei tag vuoti dai tag che racchiudono testo. Nel caso di tag vuoto la definizione è <!ELEMENT NomeElemento EMPTY> Nel caso di elementi che racchiudono testo abbiamo una definizione analoga alla seguente: <!ELEMENT Testo (#PCDATA)> Esiste la possibilità di definire elementi il cui contenuto non è definito a priori, possono cioè essere vuoti o contenere altri elementi senza vincoli particolari. <!ELEMENT NomeElemento ANY>
XML: DTD ELEMENTS Un'ulteriore possibilità è quella di avere del contenuto misto (mixed content) <!ELEMENT esempio (#PCDATA sub super)*> <!ELEMENT sub (#PCDATA)> <!ELEMENT super (#PCDATA)> <esempio>h<sub>2</sub>o non è altro che acqua</esempio> <esempio>e=mc<super>2</super></esempio>
XML: DTD ELEMENTS <!ELEMENT foo (A, (B C))> <!ELEMENT foo (A, B?, C)> <!ELEMENT foo (A?, (( B, C) D), E?)> <!ELEMENT foo ((A, B)+ (C D))> <!ELEMENT foo (A, (B, C)*, D+)>
XML: DTD ATTRIBUTES <!ATTLIST articolo titolo tipo #REQUIRED> Indica che l'elemento <articolo> prevede un attributo titolo che può avere come valore una qualsiasi combinazione di caratteri (CDATA). L'indicazione #REQUIRED indica che la presenza dell'attributo è obbligatoria. #REQUIRED obbligatorio #IMPLIED opzionale #FIXED fisso (specificato)
XML: DTD ATTRIBUTES TIPI DEGLI ATTRIBUTI CDATA stringhe ID identificatore univoco nel documento (solo uno) IDREF riferimento ad un elemento con attributo ID IDREFS serie di IDREF separati da spazi ENTITY nome di una predefinita entità ENTITIES serie di ENTITY separati da spazi NMTOKEN una parola (solo lettere, numeri, -, _,., : NMTOKENS serie di NMTOKEN separati da spazi NOTATION un'entità dichiarata nel DTD [Enumerazione] serie di valori definiti dall'utente
XML: DTD ATTRIBUTES <!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>
XML: DTD ENTITIES Quando il testo per un entity reference viene sostituito dal parser, il risultato deve essere XML ben formato. Le entità non possono fare riferimento a sè stesse o ad altre entità. ESEMPI DI ENTITA' ERRATE <!ENTITY self Dancing with my&self; > <!ENTITY una riferimento a &altra; > <!ENTITY altra riferimento a &una; >
XML: DTD ENTITIES Parameter Entities <!ENTITY % ParametriPersona altezza CDATA #REQUIRED peso CDATA #IMPLIED > <!ATTLIST DettagliPersona % ParametriPersona eta CDATA #IMPLIED > <!ATTLIST DettagliPersona altezza CDATA #REQUIRED peso CDATA #IMPLIED eta CDATA #IMPLIED >
XML: DTD NOTATION I Notations permettono di definire all'interno del DTD alcune parti del documento che non siano XML, descrivendone il formato e facendo in modo che l'applicazione che gestisce il documento possa interpretarle. <!NOTATION name system "external_id"> name identifica il formato utilizzato nel documento ed external_id spesso identifica il MIME-type. Ad esempio, volendo includere un'immagine gif nel documento: <!NOTATION GIF system "image/gif">
XML: DTD NOTATION Oppure <!NOTATION png SYSTEM " http://www.sito.it/pngviewer.exe"> I dati specificati in questo modo saranno utilizzati ad esempio: <!ENTITY logo SYSTEM http://www.sito.it/img/logo.png NDATA png>
XML: DTD NOTATION <!ELEMENT img EMPTY> <!ATTLIST img src CDATA #REQUIRED type NOTATION (gif jpg png) #IMPLIED> Potrebbe essere la definizione di un'immagine in XHTML, ovviamente deve essere data una definizione NOTATION per ogni tipo di immagine.
XML: DTD CONCLUSIONI Tuttavia i DTD hanno i seguenti limiti: la sintassi utilizzata per definire un DTD non segue le stesse regole di XML i DTD non consentono di specificare un tipo di dato per il valore degli attributi i DTD non consentono di specificare il numero minimo o massimo di occorrenze di un tag in un documento Queste limitazioni hanno spinto alla definizione di approcci alternativi per definire grammatiche per documenti XML. Tra questi approcci il più noto è XML Schema.