DTD - Document Type Definition
Il DTD contiene le regole di definizione dei tag, indica gli elementi e il loro ordine allinterno 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 lopzione #REQUIRED (nel nostro esempio il codice dellelemento libro è obbligatorio), può non avere un codice specificato se lopzione è #IMPLIED, oppure il solo valore specificato è valido con lopzione #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 ">" (<, >), 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.