DTD - Document Type Definition

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:

ContenutoDescrizioneEsempio XML
EMPTYnon è ammesso contenuto
<img />
(#PCDATA)Sta per Parsed Character Data ed è una stringa che può contenere elementi o entità che il parser deve riconoscere (es. &lt; 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 attributoDescrizioneEsempio
CDATAinterpetato 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
IDREFSelenco di IDREF
NMTOKENè un nome XML
NMTOKENSelenco di NMTOKEN
ENTITYè un entità
ENTITIESelenco di ENTITY
NOTATIONil nome di una notation
xml:valore xml predefinito

I valori che possiamo assegnare a valore-default sono:

Valore defaultDescrizioneEsempio
valoreil valore di default
#REQUIREDil valore è obbligatorio
#IMPLIEDil valore è opzionale
#FIXED valoreil 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

Lettori fissi

 
DISCLAIMER: Questo blog non costituisce una testata giornalistica. Non ha carattere periodico ed è aggiornato secondo la disponibilità e la reperibilità dei materiali. Pertanto non può essere considerato in alcun modo un prodotto editoriale ai sensi della Legge. n. 62 del 2001.
COPYRIGHT: Tutti i diritti sui testi/contenuti presenti su questo blog sono di proprietà dell'autore. Per utilizzare il materiale contattarmi all'indirizzo: nevit76@gmail.com