DTD - Document Type Definition

Il DTD contiene le regole di definizione dei tag, indica gli elementi e il loro ordine all’interno del documento XML, contrariamente a SGML il suo uso non è obbligatorio, poiché XML ha regole più vincolanti, ne è comunque consigliato l'utilizzo per verificare la validità, la congruità del documento. Il DTD può essere interno o esterno al documento XML, il suo nome per convenzione corrisponde a quello dell'elemento radice (nel nostro esempio "biblioteca").

Supponiamo di avere la seguente struttura gerarchica che rappresenti la nostra ipotetica biblioteca:

Figura 3 - Struttura gerarchica

 

Nella prossima figura (figura 4) è mostrato un DTD XML, biblioteca.dtd, che rappresenta la struttura definita precedentemente:

Figura 4 - biblioteca.dtd

<!DOCTYPE biblioteca [

<!ELEMENT biblioteca (libro+)>

<!ELEMENT libro (titolo, autore+, editore, parola_chiave+)>

<!ATTLIST libro

codice ID #REQUIRED>

<!ELEMENT titolo (#PCDATA)>

<!ELEMENT autore (cognome, nome)>

<!ELEMENT editore (#PCDATA)>

<!ELEMENT parola_chiave (#PCDATA)>

<!ELEMENT cognome (#PCDATA)>

<!ELEMENT nome (#PCDATA)>

]>

Il DTD, se è interno al documento XML, inizia con una dichiarazione DOCTYPE:

<!DOCTYPE elemento_radice [elemento, attributo, entità, notazione]>

Nel caso il DTD sia esterno la dichiarazione DOCTYPE va fatta all'interno del documento XML, il file biblioteca.xml sarebbe cosi scritto:

<?xml version="1.0"?>

<!DOCTYPE biblioteca SYSTEM "biblioteca.dtd">

<biblioteca>

...

</biblioteca>

Successivamente alla dichiarazione DOCTYPE si dichiarano gli elementi:

<!ELEMENT nome_elemento (nomi_degli_elementi_permessi)>

Nel nostro esempio, osservando la dichiarazione dell'elemento "libro" si può notare che è composto dagli elementi "titolo", "autore", "editore" e "parola_chiave": questi elementi sono separati da una virgola pertanto devono essere presenti nel file biblioteca.xml in questo stesso ordine.

Prendiamo in esame le seguenti dichiarazioni:

<!ELEMENT persona (nome|cognome)>

<!ELEMENT persona (nome|cognome|email)*>

Nel primo caso il carattere "|" sta a significare che l'elemento "persona" sarà costituito dall'elemento "nome" oppure dall'elemento "cognome"; nel secondo caso,

in cui è presente un carattere "*", da 0, 1 o più elementi "nome", "cognome", "email" in qualsiasi ordine.

Si può notare che l'elemento autore è seguito dal carattere "+", questo significa che di elementi autore ce ne sarà almeno uno ma che ce ne potrebbero essere più di uno.

 

Se un elemento, o un gruppo di elementi elencati tra parentesi, è seguito dal carattere "?" potrà essere presente zero o una volta.

<!ELEMENT titolo (#PCDATA)> significa che l'elemento titolo potrà essere composto da qualsiasi testo o altro carattere che non sia un markup o ", & oppure ]] (PCDATA = Parsed Character Data).

Mediante l'uso di attributi è possibile specificare gli elementi: si dichiarano nella forma:

<!ATTRIBUTE nome_elemento

nome_attributo tipo_di_attributo valore_di_default>

Nel nostro esempio ogni elemento libro avrà un codice univoco (ID).

I tipi di attributo possono essere CDATA (qualsiasi testo), ID o una lista di valori (tipo enumerato) e si dichiarano in questo modo:

<!ATTLIST nome_elemento

nome_attributo tipo_attributo valore_di_default>

Il valore di un attributo è obbligatorio quando è specificata l’opzione #REQUIRED (nel nostro esempio il codice dell’elemento libro è obbligatorio), può non avere un codice specificato se l’opzione è #IMPLIED, oppure il solo valore specificato è valido con l’opzione #FIXED.

Oltre agli elementi e agli attributi il DTD può contenere entità e notazioni.

Si possono definire entità nel caso ci siano elementi ripetuti spesso: ad esempio

<!ENTITY XML "eXtensible Markup Language">

ogni occorrenza di &XML sarà sostituita in fase di visualizzazione dalla stringa

" eXtensible Markup Language ".

Le entità si possono utilizzare per rappresentare caratteri riservati come ad esempio "<" o ">" (&lt, &gt), o possono essere usate per far riferimento a documenti esterni nel caso il documento XML non sia composto da un unico file:

<!ENTITY introduzione SYSTEM "introduzione.txt">

Possono esserci anche entità parametriche

<!ENTITY % [nome] "[nomi]">

ad esempio:

<!ENTITY % headings "H1 | H2 | H3 | H4">

<!ENTITY BODY (%headings | P | DIV | BR)*>

Le dichiarazioni di notazione servono per identificare specifici tipi di dati binari esterni, come ad esempio i file in formato "gif"

<!NOTATION GIF87A SYSTEM "GIF">

Perché un documento si possa dire "ben formato" deve:

Un documento si dice "valido" quando contiene un DTD e rispetta le regole definite nel DTD.