Questo documento è un commento ai file ``organizer.xml" e ``organizer.dtd". Il prologo del file ``organizer.xml":
<?xml version="1.0" standalone="no"?> <!DOCTYPE organizer SYSTEM "http://www.di.unito.it/~baroglio/proveXML/organizer.dtd">ci dice che questo documento utilizza una DTD esterna, accessibile attraverso l'URL indicata dopo la parola chiave SYSTEM. L'elemento ``organizer" definito in tale DTD è l'elemento radice del documento. Prima di analizzare il resto del documento XML, analizziamo il contenuto della DTD che definisce il linguaggio in esso utilizzato, a cominciare dalla definizione dei vari elementi:
<!ELEMENT organizer (rubrica,agenda)>L'elemento radice è definito dalla regola ``(rubrica,agenda)". A parole tale regola indica che un elemento ``organizer" è strutturato in due componenti (``rubrica" e ``agenda"). L'ordine con cui i due elementi sono elencati nella regola non è casuale ed indica che la parte di rubrica deve precedere la parte di agenda. Un elemento rubrica è cosìdefinito:
<!ELEMENT rubrica ((categoria,voce)*)>``categoria" e ``voce" sono due elementi in sequenza, come nel caso precedente. L'operatore asterisco esterno alle parentesi che raccolgono la coppia dei due elementi indica che in generale una rubrica è costituita da un elenco costituito da un numero a piacere di coppie ``(categoria,voce)". Attenzione alla posizione dell'asterisco: (categoria, voce)* è diverso da (categoria, voce*). Infatti mentre la prima regola indica una sequenza del tipo ``categoria, voce, categoria, voce, ecc." la seconda indica invece una sequenza del tipo ``categoria, voce, voce, voce, ecc". Le parentesi hanno quindi la funzione di raccogliere la sequenza di elementi alla quale l'operatore va applicato; tale sequenza verrà trattata come un oggetto inscindibile.
<!ELEMENT categoria (#PCDATA)>La regola associata a tale elemento significa che non è ulteriormente strutturato in elementi più semplici, al contrario è atomico. All'interno del tag così definito l'utente inserirà dei dati testuali.
<!ELEMENT voce (((nome,cognome)|rag_sociale),tel*,indirizzo?)>La regola che definisce l'elemento ``voce" è un po' più articolata delle precedenti. È costituita da una sequenza di tre parti. La prima, ``((nome,cognome)
Gli elementi ``nome", ``cognome", ``rag_sociale", ``tel", ``indirizzo" sono definiti allo stesso modo di ``categoria":
<!ELEMENT nome (#PCDATA)> <!ELEMENT cognome (#PCDATA)> <!ELEMENT rag_sociale (#PCDATA)> <!ELEMENT tel (#PCDATA)> <!ELEMENT indirizzo (#PCDATA)>
Infine un elemento di tipo ``appuntamento" è un elenco di elementi di tipo ``appuntamento",
che a loro volta sono definiti come ``(PCDATA)":
<!ELEMENT agenda (appuntamento*)> <!ELEMENT appuntamento (#PCDATA)>
Oltre alla definizione degli elementi visti, la DTD contiene anche la definizione di un certo numero di attributi: uno per l'elemento ``voce" e quattro per ``appuntamento:
<!ATTLIST voce id_voce ID #REQUIRED> <!ATTLIST appuntamento giorno_sett (lun | mar | mer | gio | ven | sab | dom) #IMPLIED> <!ATTLIST appuntamento luogo CDATA #REQUIRED> <!ATTLIST appuntamento chi_incontro IDREF #REQUIRED> <!ATTLIST appuntamento quando CDATA #REQUIRED>
``voce" ha un attributo identificatore (ID) di nome ``id_voce" per il quale l'utente
deve sempre specificare un valore (REQUIRED). ``appuntamento ha un attributo opzionale
(
IMPLIED) avente nome ``giorno_sett", che può assumere esclusivamente i valori elencati
fra parentesi (lun oppure mar, ecc.). Gli altri tre attributi sono tutti necessari, solo che
mentre non sono posti vincoli sui possibili valori per ``luogo" e per ``quando" (regola
CDATA), che possono quindi essere una qualsiasi stringa di caratteri, l'attributo ``chi_incontro"
può assumere come valori esclusivamente valori di attributi di tipo ID (IDREF indica
che quell'attributo conterrà riferimenti a valori di attributi ID). Poiché l'unico attributo
di tipo ID della DTD è ``id_voce", in questo campo potremo specificare solo valori
precedentemente attribuiti a ``id_voce" in qualche occorrenza dell'elemento ``voce".