next up previous
Next: Uso del linguaggio definito Up: Organizer.xml: commento Previous: Organizer.xml: commento

Definizione di un linguaggio

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) $\vert$ rag_sociale)", offre un'alternativa -barra verticale-: potremo avere o una sequenza di un ``nome" seguito da un ``cognome", oppure un elemento di tipo ``rag_sociale" (ragione sociale). Indipendentemente da questa scelta, la seconda parte della sequenza, ``tel*", indica un elenco eventualmente vuoto di elementi di tipo ``tel" (telefono). La terza ed ultima parte, ``indirizzo?", indica che un elemento ``voce" può essere completato dall'indicazione di un elemento ``indirizzo". Il simbolo punto interrogativo specifica che l'indirizzo può essere assente ma se è presente deve essere unico. In altri termini nella rubrica che sto specificando non posso inserire all'interno della stessa voce più indirizzi.

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 ``($\sharp$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 ($\sharp$REQUIRED). ``appuntamento ha un attributo opzionale ($\sharp$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".


next up previous
Next: Uso del linguaggio definito Up: Organizer.xml: commento Previous: Organizer.xml: commento
Baroglio Cristina 2003-01-14