Torna alla pagina di Tecnologie Web
:: Tecnologie Web ::
DTD
Indice
Il DTD (Document Type Definition) è una specifica della struttura di documenti XML.
Descrive:
Ovviamente applicazioni XML differenti possono utilizzare DTD differenti.
La validazione è il procedimento di controllo della validità del documento tramite DTD. Quindi se il documento ha una DTD e la soddisfa, allora viene considerato valido. I parser che effettuano la validazione dei documenti ne confrontano il contenuto con il DTD relativo ed elencano i punti del documento che non rispettano i vincoli specificati nei DTD.
Bisogna ricordare che la validazione opera sul principio che tutto ciò che non è esplicitamente permesso, è considerato vietato.
Il DTD può essere:
In tutti i casi il documento XML per il quale è richiesta la validazione deve includere un riferimento al DTD con il quale deve essere messo a confronto. Questo riferimento deve essere fornito nella dichiarazione del tipo di documento. Questa dichiarazione è compresa nel prologo del documento XML, cioè dopo la dichiarazione XML e prima dell'elemento radice.
Esempio:
<?xml version="1.0" standalone="no"?> <!DOCTYPE person SYSTEM "http://indirizzo.org/xml/dtds/person.dtd"> <person> <name> <first_name>Edgar Allan</first_name> <last_name>Poe</last_name> </name> </person>
Per definire gli elementi leciti all'interno del documento si utilizza la seguente sintassi:
<! ELEMENT nomeElemento (modelloDiContenuto)>
Il modello di contenuto può essere di vari tipi:
<! ELEMENT nomeElemento (nomeElementoAnnidato1, nomeElementoAnnidato2, ...)>
<! ELEMENT nomeElemento (#PCDATA)>
<! ELEMENT nomeElemento (#PCDATA | nomeElementoAnnidato)>
<! ELEMENT nomeElemento ANY>
<! ELEMENT nomeElemento EMPTY>
Ogni elemento può avere diversi indicatori di occorrenza per i suoi sotto-elementi, quindi diversa cardinalità:
<! ELEMENT nomeElemento (nomeElementoAnnidato)>
<! ELEMENT nomeElemento (nomeElementoAnnidato?)>
<! ELEMENT nomeElemento (nomeElementoAnnidato+)>
<! ELEMENT nomeElemento (nomeElementoAnnidato*)>
Gli attributi forniscono informazioni aggiuntive sugli elementi, e per definire quelli leciti all'interno del documento si utilizza la seguente sintassi:
<!ATTLIST nomeElemento nomeAttributo1 (tipo) valoriPredefiniti nomeAttributo2 (tipo) valoriPredefiniti ... ... ...>
I tipi sono nove:
<!ATTLIST messaggio Avviso ( basso | normale | urgente) “basso”>Ho tre valori permessi (basso, normale, urgente) di cui basso è quello predefinito.
Per quanto riguarda i valori predefiniti degli attributi, su essi possono essere imposti alcuni vincoli:
Documento XML di partenza:
<elenco> <prodotto codice="123"> <descrizione> libro </descrizione> <prezzo> 50 </prezzo> </prodotto> <prodotto codice="456"> <descrizione> penna stilo </descrizione> </prodotto> </elenco>
DTD risultante:
(1) <!ELEMENT ELENCO (PRODOTTO+)> (2) <!ELEMENT PRODOTTO (DESCRIZIONE, PREZZO?)> (3) <!ATTLIST PRODOTTO codice ID #REQUIRED> (4) <!ELEMENT DESCRIZIONE (#PCDATA)> (5) <!ELEMENT PREZZO (#PCDATA)>
Commenti punto per punto:
Nei concetti generali abbiamo già visto che XML prevede cinque referenze ad entità predefinite, ma il DTD permette di definirne altre.
Un'entità è un modo per definire singoli blocchi di informazioni. Faccio riferimento ad entità esterne o interne per includerle in documenti.
Le entità vengono definite tramite la seguente sintassi:
<!ENTITY nomeEntità "testoDaSostituireAllEntità">
Una volta che l'entità viene definita è possibile utilizzarla in qualsiasi punto del documento tramite &nomeEntità;.
Esempio:
<!ENTITY super "supercalifragilistichespiralidoso">
NOTA: le entità possono contenere anche markup, quindi ad esempio un piè di pagina o un'intestazione standard di pagine web che si ripete più volte nelle pagine.
Il Document Type Definition è molto semplice da scrivere e questo ha un prezzo:
Abbiamo il seguente documento XML:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE racconti SYSTEM "racconti.dtd"> <racconti> <!-- Questo commento lo inserisco perché mi serve provare il rilevamento dei commenti di XPath :P --> <racconto autore="Howard Phillips Lovecraft"> <titoloItaliano>L'estraneo</titoloItaliano> <titoloOriginale>The Outsider</titoloOriginale> <notaIntroduttiva> The Outsider è considerato uno degli esempi più palesi dell'influsso che lo stile e le tematiche di Edgar Allan Poe hanno esercitato su Lovecraft. La storia ha una sottintesa nota autobiografica. Nel protagonista, che cresce solo in una grande casa, nutrendo la sua cultura di vecchi libri, è facile riconoscere l'infanzia solitaria dello stesso Lovecraft. L'invocazione finale all'oblio di fronte agli orrori dell'esistenza da "estraneo" proiettato nel mondo comune si ripeterà continuamente nella sua opera, soprattutto quella poetica, nella quale si riflettono più chiaramente le angosce dell'anima. </notaIntroduttiva> <frammento> Infelice chi dell'infanzia ha soltanto memorie di paura e tristezza. Sventurato chi, volgendosi indietro, non vede che ore solitarie trascorse in sale vaste e malinconiche tappezzate di lugubri tendaggi e file esasperanti di libri antichi, o in desolate veglie in boschi crepuscolari fitti di immensi alberi grotteschi coperti da erbe, che agitano silenziosi in alto i rami contorti... </frammento> </racconto> <racconto autore="Edgar Allan Poe"> <titoloItaliano>La mascherata della Morte Rossa</titoloItaliano> <titoloOriginale>The Mask of the Red Death</titoloOriginale> <frammento> La settima stanza era pesantemente avvolta in panneggi di velluto nero che pendevano ovunque dal soffitto e dalle pareti, ricadendo in pesanti pieghe su un tappeto della stessa stoffa e colore. In quest'unica stanza pero' la tinta delle finestre non corrispondeva alle decorazioni. Le vetrate erano di colore scarlatto, di un cupo color sangue. Ora in nessuna di quele sette stanze vi era una sola lampada o candelabro, pur tra la profusione di ornamenti dorati sparsi qua e la' o pendenti dai soffitti. </frammento> </racconto> <racconto autore="Howard Phillips Lovecraft"> <titoloItaliano>La musica di Erich Zann</titoloItaliano> <titoloOriginale>The Music of Erich Zann</titoloOriginale> <notaIntroduttiva> Quando il saggista francese Jacques Bergier chiese a Lovecraft se avesse mai visitato Parigi, per averne descritto così bene l'atmosfera di certi quartieri, Lovecraft gli rispose:"certo che l'ho visitata. Con Poe, in sogno". Malgrado l'apparenza onirica non è tratta da un unico sogno; tuttavia ho sognato spesso di strade tortuose come la Rue d'Auseil. </notaIntroduttiva> <frammento> Riuscii invece a sentire la musica del vecchio muto: prima salendo in punta di piedi fino al quinto piano, poi trovando il coraggio necessario per inerpicarmi su per l'ultima rampa scricchiolante che conduceva alla mansarda di Zann. E lì, nell'angusto pianerottolo davanti alla porta sprangata e col buco della serratura tappato, più volte udii suoni che mi colmarono di un terrore indefinibile, un terrore di occulti prodigi e celati misteri. </frammento> </racconto> </racconti>
Il DTD relativo sarà:
<!ELEMENT racconti (racconto+)> <!ELEMENT racconto (titoloItaliano, titoloOriginale, notaIntroduttiva*, frammento)> <!ATTLIST racconto autore CDATA #REQUIRED> <!ELEMENT titoloItaliano (#PCDATA)> <!ELEMENT titoloOriginale (#PCDATA)> <!ELEMENT notaIntroduttiva (#PCDATA)> <!ELEMENT frammento (#PCDATA)>