Introduzione
Supponiamo di aver bisogno di un XML (ben formato / well formed) per rappresentare lo scambio di messaggi tra utenti.
Il singolo messaggio dovrà contenere la data di invio, il mittente, il destinatario e il corpo del messaggio. I valori sono da intendersi tutti obbligatori.
Possiamo inventarci e utilizzare un documento XML di questo tipo:
<messaggio data="data_del_messaggio">
<mittente>nome_mittente</mittente>
<destinatario>nome_destinatario</destinatario>
<corpo>corpo_del_messaggio</corpo>
</messaggio>
chiamiamo questo nuovo linguaggio MSGXML.
Supponiamo, inoltre, che questi messaggi debbano essere letti o generati da software diversi, sviluppati da persone diverse. In tal caso occorrerà:
- stabilire un modo formale (esatto/"matematico"/univoco) per condividere la sua struttura e le sue regole con altri sviluppatori
- avere un meccanismo che ci permetta di validare i messaggi di questo "nuovo" formato
In questi casi una soluzione è il DTD (Document Type Definition) che ci permette di definire il documento specificando la struttura e gli elementi/attributi/valori ammessi.
Un documento XML ben formato che rispetta le regole indicate in un DTD si dice valido, non valido altrimenti.
La stessa cosa è stata fatta ad esempio per l'HTML o l'XHTML:
... e un documento XHTML che non rispetta le regole previste nel suo DTD si dice non valido.
Procediamo quindi con una descrizione del DTD che ci aiuterà a definire formalmente il nostro linguaggio.
Struttura di un DTD
Il DTD ci permette di descrivere la struttura e tutti i "mattoni" fondamentali di un doc. XML (elementi, attributi, entità) attraverso l'uso di dichiarazioni che specificano:
- gli elementi, il loro nome e il contenuto ammesso
- gli attributi degli elementi, il loro nome e i valori ammessi
- definire nuove entità
Un DTD è in sostanza un documento che contiene un elenco di dichiarazioni che hanno la forma seguente:
<!tipo_dichiarazione parametri_dichiarazione >
dove tipo_dichiarazione può essere ELEMENT, ATTLIST, ENTITY e parametri_dichiarazione varia in base al tipo_dichiarazione indicato.
Definizione degli elementi
Con DTD possiamo definire gli elementi del nostro documento in questo modo:
<!ELEMENT elemento_contenitore contenuto>
Ad esempio la definizione del tag img in xhtml è
<!ELEMENT img EMPTY>
dove con EMPTY si indica che l'elemento non ha contenuto.
I possibili valori che possiamo assegnare a contenuto
sono:
Contenuto | Descrizione | Esempio XML |
---|---|---|
EMPTY | non è ammesso contenuto |
|
(#PCDATA) | Sta per Parsed Character Data ed è una stringa che può contenere elementi o entità che il parser deve riconoscere (es. < diventerà <, <p> sarè riconosciuto come tag di apertura etc.). | |
ANY | ||
(elemento) | 1 sola occorrenza di elemento | |
(elemento?) | 0 o 1 occorrenze di elemento | |
(elemento*) | 0 o più occorrenze di elemento | |
(elemento+) | 1 o più occorrenze di elemento | |
(elemento1, elemento2, ...) | gli elementi devono presentarsi nella stessa sequenza indicata | |
(elemento1 | elemento2) | o un elemento o l'altro |
Per MSGXML possiamo definire la struttura del documento:
<!ELEMENT messaggio (mittente, destinatario, contenuto)>
<!ELEMENT mittente (#PCDATA)>
<!ELEMENT destinatario (#PCDATA)>
<!ELEMENT contenuto (#PCDATA)>
in cui gli elementi mittente, destinatario, contenuto devono apparire esattamente in questo ordine.
Definizione degli attributi
Gli attributi possono essere definiti in questo modo:
<!ATTLIST nome-elemento nome-attributo tipo-attributo valore-default>
I valori che possiamo assegnare a tipo-attributo
sono:
Tipo attributo | Descrizione | Esempio |
---|---|---|
CDATA | interpetato come normale testo: le entità vengono prese così come sono e non convertite, i tag presi così come sono, etc. | |
(val1|val2|..) | deve essere un valore tra quelli indicati | |
ID | è un id univoco | |
IDREF | è un riferimento a un id di un altro elemento | |
IDREFS | elenco di IDREF | |
NMTOKEN | è un nome XML | |
NMTOKENS | elenco di NMTOKEN | |
ENTITY | è un entità | |
ENTITIES | elenco di ENTITY | |
NOTATION | il nome di una notation | |
xml: | valore xml predefinito |
I valori che possiamo assegnare a valore-default
sono:
Valore default | Descrizione | Esempio |
---|---|---|
valore | il valore di default | |
#REQUIRED | il valore è obbligatorio | |
#IMPLIED | il valore è opzionale | |
#FIXED valore | il valore dell'attributo è fisso |
Per MSGXML possiamo definire l'attributo dell'elemento messaggio in questo modo:
<!ATTLIST messaggio data CDATA #REQUIRED>
Definizione delle entità
<!ENTITY nome-entita "valore-entita">
Dichiarazione del DTD
Ciò che manca ora è l'indicazione di quale sia l'elemento di root e del modo per utilizzare il DTD o indicare che un doc. XML deve rispettare le regole/dichiarazioni definite in un DTD.
Ciò può essere fatto attraverso la dichiarazione DOCTYPE che ci permette di utilizzare il nostro DTD o includendolo nel nostro file XML o richiamando un file di dichiarazioni .dtd direttamente dal file XML.
Nel primo caso avremo:
<?xml version="1.0"?>
<!DOCTYPE elemento_root [
dichiarazioni
]>
...
nel secondo:
<?xml version="1.0"?>
<!DOCTYPE elemento_root SYSTEM "URI" >
oppure
<?xml version="1.0"?>
<!DOCTYPE elemento_root PUBLIC "FPI" "URI" >
dove con elemento_root indichiamo l'elemento root del nostro linguaggio XML .
La differenza tra i due sta nella parola chiave SYSTEM o PUBLIC.
A SYSTEM può seguire subito l'URI (assoluto o relativo) del dtd.
Nel secondo l'URI del DTD è opzionale ma deve essere presente l' FPI (Formal Public Identifier) che in poche parole identifica la specifica. Ad esempio:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
DTD di MSGXML
Ora che abbiamo visto tutti gli argomenti possiamo assemblare il nostro msgxml.dtd.
<!ELEMENT messaggio (mittente, destinatario, contenuto)*>
<!ATTLIST messaggio data CDATA #REQUIRED>
<!ELEMENT mittente (#PCDATA)>
<!ELEMENT destinatario (#PCDATA)>
<!ELEMENT contenuto (#PCDATA)>
L'XML corrispondente sarà:
<?xml version="1.0"?>
<!DOCTYPE messaggio SYSTEM "msgxml.dtd" >
<messaggio data="1/1/2011">
<mittente>superman</mittente>
<destinatario>batman</destinatario>
<contenuto>ciao come stai?</contenuto>
</messaggio>
0 commenti:
Posta un commento