back to top

DTD – Document Type Definition

Una caratteristica fondamentale dell’XML è l’estensibilità. L’autore – nell’accezione estesa specificata nell’introduzione di questa guida a XML – 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;

Quando un documento XML è ben formato (well formed) e rispetta le regole del DTD a cui si riferisce si dice che è un documento XML valido.

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 un ipotetico XML riguardanti articoli di 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</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>

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>
Pubblicitร 
Articolo successivo