DTD

La rapida diffusione del linguaggio XML ha portato alla creazione di diversi strumenti volti alla definizione della grammatica associata ad un documento XML. Uno dei primi strumenti a diffondersi in tal senso è stato il DTD (Document Type Definition). Un documento DTD è un documento incaricato di descrivere i tag inseribili all’interno di un documento XML, le relazioni esistenti in rapporto alla struttura e gli attributi specificabili.

All’interno di una definizione DTD è possibile utilizzare le seguenti dichiarazioni per specificare gli elementi inseribili in un documento XML e gli attributi a loro assegnabili:

<!ELEMENT>
<!ATTLIST>

Ad esempio la seguente dichiarazione definisce un elemento “ricettario” all’interno del quale possono essere inseriti uno o più elementi “ricetta”.

<!ELEMENT ricettario(ricetta+)>

Il carattere ‘+’ stabilisce il numero di occorrenze dell’elemento, le altre particelle utilizzabili a tale scopo sono:

  • ?, l’elemento è presente zero o una volta;
  • *, l’elemento è presente zero o più volte;
  • +, l’elemento è presente una o più volte.

Ad esempio la seguente dichiarazione:

<!ELEMENT libro(indice?,capitolo+)>

Definisce come all’interno di un elemento “libro” possa essere inserito nessuno o un elemento “indice” e uno o tanti elementi “capitolo”. Durante la stesura del documento XML non potranno essere inseriti altri elementi all’interno del nodo “libro” e non sarà possibile inserire gli elementi “indice” e “capitolo” in un ordine diverso da quello indicato.

Saranno quindi accettati i documenti:

<libro>
  <capitolo></capitolo>
</libro>

<!-- oppure -->
<libro>
  <capitolo></capitolo>
  <capitolo></capitolo>
</libro>

<!-- oppure -->
<libro>
  <indice></indice>
  <capitolo></capitolo>
  <capitolo></capitolo>
</libro>

<!-- ecc -->

Un elemento “vuoto” può essere definito nel modo seguente:

<!ELEMENT autore EMPTY>

È inoltre possibile definire elementi il cui contenuto non è vincolato a priori, essi potranno essere sia “pieni” che “vuoti” e contenere qualunque altro tag senza uno schema preciso.

<!ELEMENT autore ANY>

Nel caso di elementi contenenti del semplice testo è possibile utilizzare una dichiarazione analoga:

<!ELEMENT pagina (#PCDATA)>

Dove #PCDATA rappresenta una qualsiasi combinazione di caratteri inseribili all’interno del tag “pagina”.

Gli attributi saranno invece definiti mediante la seguente dichiarazione:

<!ATTLIST>

Un attributo può essere:

  • #REQUIRED, obbligatorio;
  • #IMPLIED, facoltativo;
  • #FIXED ‘value’, fissato con il valore ‘value’;
  • ‘value’, preimpostato con un valore di default.

Ogni elemento può contenere uno o più attributi, che a loro volta possono contenere del testo generico, oppure dei valori prefissati. Consideriamo ad esempio l’elemento “capitolo” contenente al suo interno un insieme di pagine, per ogni capitolo dovremmo memorizzare un titolo e un identificativo numerico.

<!ELEMENT capitolo (pagina+)>
<!ATTLIST capitolo titolo CDATA #REQUIRED num CDATA #REQUIRED>

Ogni libro potrebbe essere invece caratterizzato da una tipologia prefissata:

<!ELEMENT libro(indice?,capitolo+)>
<!ATTLIST libro tipo(biografia|giallo|avventura|romanzo) #IMPLIED>

Ogni elemento di tipo “capitolo” dovrà contenere un attributo di nome titolo e un attributo di nome num, questi potranno essere inseriti in un ordine arbitrario, infatti, al contrario degli elementi per gli attributi non è previsto alcun vincolo d’ordine. Ogni elemento “libro” potrà invece contenere, o non contenere, un attributo di nome tipo.

Gli attributi titolo e num contengono la clausola CDATA, l’equivalente di #PCDATA per gli attributi, potranno quindi contenere delle stringhe di testo arbitrarie, infine, l’attributo tipo potrà contenere solo uno dei quattro valori indicati.

Tra le clausole inseribili all’interno della definizione di un attributo troviamo:

  • CDATA, rappresentante un qualsiasi valore;
  • enumeration value, rappresentante un insieme di valori esclusivi e accettabili nella forma (v1|v2|v3);
  • ID, rappresentante un identificativo univoco;
  • IDREF/IDREFS, rappresentante un riferimento a un altro identificativo.

Utilizzando la notazione enumeration value non sarà possibile indicare valori contenenti degli spazi.

Alcuni esempi:

<!ATTLIST p align (left|center|right|justify) #IMPLIED>
<!ATTLIST libro id ID #IMPLIED>
<!ATTLIST libro_collegato ref IDREF #IMPLIED>

Definire le entità

All’interno del capitolo dedicato al linguaggio XML sono state introdotte alcune entità in grado di rappresentare simboli dal valore critico.

Entità Valore
&amp; &
&lt; <
&gt; >
&quot;
&apos;

Grazie alle tecniche offerte dal DTD è ora possibile definire delle ulteriori entità personalizzate, da utilizzare all’interno della stesura dei documenti XML.

<!ENTITY XML "eXtensible Markup Language">

La precedente definizione asserisce una nuova entità XML che andrà a rappresentare il testo “eXtensible Markup Language”, all’interno del documento l’entità dovrà essere rappresentata tra i caratteri ‘&’ e ‘;’.

<nodo>&amp;xml;</nodo>

Allegare un DTD a un documento XML

Una volta completata la definizione di un DTD non dovremmo fare altro che associarlo ad ogni documento XML che dovrà rispettare tale grammatica e successivamente verificare la sua correttezza mediante un parser. Esistono due tecniche che permettono l’inclusione di un DTD all’interno di un documento XML, la prima prevede la stesura del corpo del DTD all’interno del documento XML stesso.

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE libreria_personale[
  <!-- definizione del DTD -->
]>

<libreria_personale>
  <libro tipo="biografia">
    <autore nome="Mario" cognome="Rossi"/>
    <indice></indice>
    <capitolo titolo="Così tutto è iniziato" num="1">
      <pagina>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</pagina>
      <pagina>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</pagina>
      <pagina>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</pagina>
    </capitolo>
    <capitolo titolo="Così tutto è proseguito" num="2">
      <pagina>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</pagina>
    </capitolo>
  </libro>
  <libro>
    <autore nome="Luca" cognome="Verdi"/>
    <capitolo num="1" titolo="La svolta">
      <pagina>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</pagina>
      <pagina>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</pagina>
    </capitolo>
  </libro>
</libreria_personale>

La seconda prevede l’inclusione, all’interno del documento XML, di un file esterno contenente il DTD.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE libreria_personale SYSTEM “libreria.dtd">

Il precedente frammento di codice definisce un DTD per il nodo “libraria_personale” a partire dal file libreria.dtd. Un DTD per il precedente documento potrebbe essere il seguente:

<!ELEMENT libreria_personale (libro+)>
<!ELEMENT libro (autore,indice?,capitolo+)>
<!ATTLIST libro tipo (biografia|giallo|avventura|romanzo) #IMPLIED>
<!ELEMENT autore EMPTY>
<!ATTLIST autore nome CDATA #REQUIRED cognome CDATA #REQUIRED>
<!ELEMENT indice (#PCDATA)>
<!ELEMENT capitolo (pagina+)>
<!ATTLIST capitolo titolo CDATA #REQUIRED num CDATA #REQUIRED>
<!ELEMENT pagina (#PCDATA)>

Una volta completato il nostro documento potremmo validarlo utilizzando lo strumento messo a disposizione del W3C: W3C Validator.