# 4.1 - La dichiarazione degli elementi

La forma delle dichiarazioni degli elementi di una DTD e' legata a quelle delle regole grammaticali prive di contesto (free context grammars, studiati dal linguista N. Chomsky), ovvero la Backus-Naur Form (BNF). La BNF viene utilizzata per definire la sintassi o la struttura dei linguaggi di programmazione. Una DTD descrive la struttura di un particolare set di tag XML, per cui e' naturale che le sue regole assomiglino a quelle della BNF

Ogni dichiarazione di elemento di una DTD specifica la struttura di una categoria (o classe di elementi). La dichiarazione fornisce il nome dell'elemento di cui definiscono la struttura e le specifiche di tale struttura.

I documenti xml hanno la struttura di un albero. Ogni elemento rappresenta un nodo foglia o un nodo interno di tale albero:

- se si tratta di un elemento che funge da nodo foglia la sua descrizione sintattica consiste nella sua struttura dei caratteri.
- nel caso invece si tratti di un nodo interno, la descrizione sintattica consiste in un elenco degli elementi figli, ognuno dei quali puo' rappresentare uno dei due tipi di nodo.

La forma di una dichiarazione per elementi dotati di elementi figli e' la seguente:

`<!ELEMENT nome_elemento (elenco di nomi degli elementi figli)>`

Per esempio si consideri la seguente dichiarazione:

`<!ELEMENT memo (from, to, date, re, body)>`

la cui struttura potrebbe essere quella mnostrata in figura:

Figura: un esempio di struttura ad albero della definizione di un elemento

Spesso e' necessario specificare il numero di volte in cui appare un elemento figlio. Questa operazione e' possibile aggiungendo un modificatore alla specifica dell'elemento figlio nella dichiarazione DTD. I modificatori in questione sono descritti nella tabella sottostante (e sono stati presi in prestito dalla espressioni regolari delle context free grammars). Qualsiasi specifica di un elemento figlio puo' essere seguita da uno di questi modificatori:

Modificatore | Significato
--- | ---
+ | una o piu' occorrenze
* | zero o piu' occorrenze
? | zero o una occorrenza

Tabella: Modificatori delle specifiche degli elementi figli

Si consideri la seguente dichiarazione DTD:

`<!ELEMENT person (parent+, age, spouse?, sibling*)>`

In questo esempio viene specificato che un elemento `person` abbia i seguenti elementi figli: :

- uno o piu' elementi `parent`,
- uno elemento `age`,
- eventualmente un elemento `spouse`,
- zero o piu' elementi `sibling`.

I nodi foglia di una DTD specificano i tipi di dati del contenuto dei loro nodi genitori, ovvero degli elementi. Nella maggior parte dei casi il contenuto di un elemento e' di tipo `PCDATA`, acronimo di parsable character data. E' possibile specificare altri due tipi di contenuto :

- `EMPTY`, per specificare che l'elemento terminale non ha contenuto (si tratta di elementi simili all'elemento `IMG` dell'html);
- `ANY`, per specificare che un elemento puo' includere letteralmente qualsiasi contenuto.

La forma della dichiarazione di un elemento foglia (terminale) e' come sotto:

`<!ELEMENT partecipant (#PCDATA)>`