Creare un file dtd valido

Obiettivo
In questo articolo tratteremo come creare un file dtd valido.

Cosa è un file dtd?
Un insieme di regole per costruire documenti XML “validi” e non solo sintatticamente (well
formed).In altre parole “limitiamo” la possibilità di creare elementi a piacere definendo la lista dei possibili tag.

Le dtd possono trovarsi dentro al documento XML oppure essere dichiarate in un file esterno .dtd e poi essere richiamate.
Ad esempio per un file html la dtd è richiamata da:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Vediamo come si fa per dichirarle interne al documento

<!DOCTYPE elementroot [ defs ]>

All’esterno del documento XML

<!DOCTYPE elementroot SYSTEM “nomedtd.dtd">

Entrambe le possibilità

<!DOCTYPE elementroot SYSTEM “nomedtd.dtd“[ defs ]>

Il mio primo file xml con dtd

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE ElementoRadice [
<!ELEMENT Elemento (#PCDATA)>
]>

La prima riga definisce il tipo di documento che stiamo utilizzando.
La seconda riga (DOCTYPE) specifica la dtd e indica il nome dell'elemento di livello principale del documento.
La terza riga (ELEMENT) specifica un elemento della dtd che diciamo essere di tipo #PCDATA (caratteri)

Un esempio più completo
In questo esempio vedremo come creare una semplice struttura "note" in cui abbiamo 4 campi di tipo carattere

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Pippo</to>
<from>Mario</from>
<heading>Sono la testa</heading>
<body>Sono il corpo</body>
</note>

Elementi caratteristici
Gli elementi caratteristici delle dtd sono:

Tags
Attributi
Entità
PCDATA
CDATA

Questi si dichiarano cosi:

<!ELEMENT element-name (element-content)>

esempio:

<!ELEMENT codicefiscale (#PCDATA)>

Più occorrenze dello stesso elemento:
Element*
Una o + occorrenze dello stesso elemento
Element+
Zero o una occorrenza dell’elemento
Element?

La condizione or è possibile nella dichiarazione dei figli di un elemento tramite
Il simbolo |

<!ELEMENT nome (mario | pippo)

Naturalmente occorre poi definire Pippo e Mario

Altro contenuto: (EMPTY/ANY)
(!ELEMENT elemento EMPTY) Che si traduce nella dichiarazione legale Di <elemento/>
(!ELEMENT elemento ANY) Che significa che dentro ci posso mettere sia testo che altri elementi (purché definiti)

Se volessi “limitare” il contenuto di un Elemento a testo e alcuni elementi fissati
devo scrivere.

<!ELEMENT elemento (#PCDATA|child1|child2|…|childn)*>

Tipi di Attributi
Stringa: CDATA
Token:
ID: verifica che gli l’attributo è univoco.
IDREF(S): verifica che sia uno (o più) valori di qualche id.
ENTITY(IES): lista di una o più entità
NMTOKEN(S): lista di uno o più nomi validi.

Valori
<!ATTLIST element-name attribute-name attribute-type default-value>
Il default value: “value” (può essere cambiato, assente nel qual caso vale “value”
#REQUIRED (non so quale ma ci vuole un valore)
#IMPLIED (non mi importa se c’è)
#FIXED “value” (ci deve essere e deve essere “value”)
Con le dovute cautele
Es. Attributo di tipo ID non possono avere un valore #FIXED

Attributi Enumerati
Attributi enumerati: contengono una lista di valori possibili:
<!ATTLIST element attr (a|b|c) “a”>
Se non voglio mettere un valore di default uso #IMPLIED