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>