DTD - Document Type Definition
Una caratteristica fondamentale dell'XML è l'estensibilità. L'autore - nell'accezione estesa specificata nella prima lezione - di un documento XML può creare nuovi tag per descrivere i contenuti semantici dei propri dati, semplificando il loro scambio fra i gruppi di persone interessate allo stesso settore.
Ciò ha portato alla necessità di definire delle regole grammaticali, o vincoli, alle quali gli elementi devono attenersi.
Queste regole grammaticali sono definite nelle specifiche XML e sono codificate nel DTD (acronimo di Document Type Definition che significa definizione del tipo di documento.
Le regole grammaticali o vincoli specificano:
- qual'è l'insieme degli elementi e degli attributi che si possono usare nel documento XML;
- quali sono le relazioni gerarchiche fra gli elementi;
- qual'è l'ordine in cui gli elementi appariranno nel documento XML;
- quali elementi ed attributi sono opzionali;
In un documento XML si può specificare il DTD in modo esplicito (DTD interno) o con un riferimento ad un documento distinto (DTD esterno).
Se il DTD è interno, deve essere dichiarato con la seguente sintassi:
<!DOCTYPE elemento-radice [dichiarazione-elementi]>Esempio semplificato per una legge:
<?xml version="1.0"?>
<!DOCTYPE Legge [
<!ELEMENT Legge (TitoloLegge,Articolato) >
<!ELEMENT TitoloLegge (#PCDATA)>
<!ELEMENT Articolato (Capo+)>
<!ELEMENT Capo (Rubrica?,Articolo+)>
<!ELEMENT Rubrica (#PCDATA)>
<!ELEMENT Articolo (Rubrica?,Comma+)>
<!ELEMENT Comma (#PCDATA)>
<!ATTLIST Capo Num CDATA #REQUIRED>
<!ATTLIST Articolo Num CDATA #REQUIRED>
<!ATTLIST Comma Num CDATA #REQUIRED>
]>
<Legge>
<TitoloLegge>Disciplina delle associazioni a scopo benefico</TitoloLegge>
<Articolato>
<Capo Num="I">
<Rubrica>DISPOSIZIONI GENERALI</Rubrica>
<Articolo Num="1">
<Rubrica>Finalità e oggetto della legge</Rubrica>
<Comma Num="1">La Repubblica riconosce il valore sociale...</Comma>
...
</Legge>
Se il DTD è esterno, deve essere dichiarato con la seguente sintassi:
<!DOCTYPE elemento-radice SYSTEM "nome-file">Vediamo lo stesso esempio semplificato con la dichiarazione esterna:
<?xml version="1.0"?>
<!DOCTYPE Legge SYSTEM "legge.dtd">
<Legge>
<TitoloLegge>Disciplina delle associazioni di promozione sociale
<Articolato>
<Capo Num="I">
<Rubrica>DISPOSIZIONI GENERALI</Rubrica>
<Articolo Num="1">
<Rubrica>Finalità e oggetto della legge</Rubrica>
<Comma Num="1">La Repubblica riconosce il valore sociale...</Comma>
...
</Legge>
dove legge.dtd è un file esterno che contiene il DTD per il documento XML, e cioé le righe:<!ELEMENT Legge (TitoloLegge,Articolato)> <!ELEMENT TitoloLegge (#PCDATA)> <!ELEMENT Articolato (Capo+)> <!ELEMENT Capo (Rubrica?,Articolo+)> <!ELEMENT Articolo (Rubrica?,Comma+)> <!ELEMENT Rubrica (#PCDATA)> <!ELEMENT Comma (#PCDATA)> <!ATTLIST Capo Num CDATA #REQUIRED> <!ATTLIST Articolo Num CDATA #REQUIRED> <!ATTLIST Comma Num CDATA #REQUIRED>In un DTD gli elementi del documento XML sono definiti tramite una dichiarazione di elemento che può assumere tre forme.
Prima forma:
<!ELEMENT NomeElemento (#PCDATA)>Questa è la forma più semplice in cui si dichiara che un elemento può contenere come valore una qualsiasi stringa di testo; ad esempio:
<!ELEMENT Rubrica (#PCDATA)>In questo caso il documento XML che fa riferimento al DTD contenente tale dichiarazione potrà contenere un elemento del tipo:
... <Rubrica>DISPOSIZIONI GENERALI</Rubrica> ...Seconda forma:
<!ELEMENT NomeElemento EMPTY>Questa è la forma con la quale si dichiara che un elemento è privo di valore. In questo caso all'elemento sono sempre associati uno o più attributi:
<!ELEMENT Numero EMPTY> <!ATTLIST Numero Valore CDATA #REQUIRED>e quindi il documento XML che fa riferimento al DTD contenente tale dichiarazione potrà contenere un elemento del tipo:
... <Numero Valore="1"/> ...Terza forma:
<!ELEMENT NomeElemento (ElementoFiglio1, ElementoFiglio2, ...)>Questa è la forma a contenitore in cui si dichiara che un elemento è composto da sotto-elementi (figli) con i quali s'instaura una stretta gerarchia del tipo padre-figlio
<!ELEMENT Legge (TitoloLegge, Articolato)> <!ELEMENT TitoloLegge (#PCDATA)> <!ELEMENT Articolato (...)>In questo caso il documento XML che fa riferimento al DTD contenente tale dichiarazione potrà contenere un elemento del tipo:
<Legge> <TitoloLegge>Disciplina delle associazioni a scopo benefico</TitoloLegge> <Articolato> ... </Articolato> </Legge>







