Kosmous beyond the clouds: Sviluppo, Formazione e Consulenza Informatica

Introduzione all'XML

L'XML (eXtensible Markup Language) è un linguaggio di markup nato dallo sviluppo di SGML (progenitore di HTML) e che è ormai diventato uno standard per la creazione della struttura di documenti nei più disparati campi: dal Web alla gestione di documenti, passando per i files di configurazione di numerosi applicativi. Si noti bene che abbiamo parlato di struttura, perchè XML è soltanto questo; singolarmente, XML non permette nessun tipo di visualizzazione o output.
XML è un insieme di tag personalizzati dall'utente, percui lo si dovrebbe definire un linguaggio di meta-markup, perchè non ha un set di tag predefiniti. Chi utilizza XML può creare una struttura di layout che più si addice al problema da risolvere, definendo tag specifici. In pratica, qualunque dato può essere definito tramite XML.

Per iniziare con un esempio, un semplice codice XML per descrivere un testo potrebbe essere:

<?xml version="1.0"?>
<testo>
    <capitolo>

        <paragrafo>Primo paragrafo</paragrafo>
        <paragrafo>Secondo paragrafo</paragrafo>        
    </capitolo>    
    <nota>Nota</nota>
</testo>


Ogni tag presente indica abbastanza chiaramente quali parti del documento vogliamo descrivere e come deve essere strutturato. Ecco perchè XML può essere utilizzato in qualunque settore per definire una formattazione standard di documenti, che può essere facilmente condivisa fra piattaforme garantendo quindi una elevata portabilità.

Come è formato un documento XML.


All'inizio di un sorgente XML si utilizza l'istruzione:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

L'attributo version indica la versione in uso di XML; non si deve pensare che, in seguito allo sviluppo di versioni future di XML, questo attributo vada aggiornato o dia problemi. XML è stato pensato per essere compatibile con versioni precedenti e future. L'attributo opzionale encoding indica quale codifca e set di caratteri viene utilizzato; di default XML utilizza UTF-8. L'attributo opzionale standalone indica se il sorgente e' collegato ad una DTD (vedi paragrafo successivo) esterna (standalone="no") o interna. Infatti la DTD può essere indicata in un file esterno o inserita nel sorgente stesso dopo la dichiarazione iniziale. Vedremo in seguito come gestire le due situazioni.

Ogni tag definito in XML rappresenta un elemento, con una sintassi simile all'HTML: esiste un tag di apertura <tag> e uno di chiusura </tag>, ed il testo contenuto all'interno rappresenta il valore di quell'elemento.
Esistono anche elementi con valore nullo, e possono essere con tag singoli nella forma <tag />. Ad esempio, si vedano <br /> o <hr /> come nell'XHTML.
A differenza dell'HTML, XML è case-sensitive, percui bisogna essere consistenti quando si definiscono i tag.

Come è facile intuire, la struttura di un sorgente XML è vista come un albero: vi è sempre un elemento root, primo elemento del sorgente; gli elementi contenuti al suo interno sono figli; nell'esempio <testo> è elemento root, mentre <capitolo> è figlio di <testo> nonchè fratello di <nota>; a sua volta <capitolo> è padre degli elementi <paragrafo>
L'XML ci permette di utilizzare anche gli attributi, che sono delle coppie nome-valore all'interno del tag di apertura di un elemento. Ad esempio, possiamo scrivere nel nostro esempio:
<testo data="20/02/1980" autore="Kosmo Us">
.....
</testo> 


i due attributi data e autore danno ulteriore informazioni sul tag in cui sono inseriti. Ma quale vantaggio si ha ad utilizzare attributi al posto di elementi? In effetti avremmo potuto definire due elementi, figli di <testo>:

<testo>
    <data>20/02/1980</data>

    <autore>Kosmo Us</autore>
	.........
</testo>
L'utilizzo di attributi o elementi dipende dalle nostre scelte e dall'utilizzo del sorgente XML. L'utilizzo di elementi risulta essere più orientato ai dati e al loro salvataggio, mentre l'utilizzo di attributi si associa più a documenti dove è importante il contenuto.

Per quanto riguarda i commenti, questi vengono inseriti in maniera identica all'HTML, cioe' all'interno dei tag <!-- -->

Quando vogliamo inserire in un documento dell porzioni di testo che dovranno essre visualizzate così come sono, e quindi preferiamo evitare che il parser lavori su quella porzione di testo, inseriamo il codice in elementi CDATA (Character Data), che prevedono i tag <![CDATA[ e ]]>.
Se volessimo visualizzare il sorgente XML, potremmo inserirlo in un elemento CDATA e il parser non interpreterebbe i tag da noi creati.

Se volessimo ancora visualizzare caratteri che il parser interpreta, dovremmo in alcuni casi far ricorso alle entità. Le entità sono speciali sequenze che ci permettono di fare operazioni di escape; le principali entità XML sono:
  • < <
  • & &
  • > >
  • " "
  • ' '
alcuni di queste entità sostituiscono caratteri fondamentali per XML, come l' < (indica l'inizio di un tag) e &, che non possono essere visualizzati in maniera letterale perchè il parser tenterebbe di convertirli.

Abbiamo visto che i sorgenti XML presentano una struttura ad albero, e per essere dei file ben formati devono rispettare le regole di composizione di XML:
  • i nomi in XML (sintassi dei tag) possono essere composti da un qualunque carattere alfa-numerico, compresi i caratteri . - _
  • ogni tag aperto deve essere chiuso
  • ci deve essere uno e un solo elemento radice (root)
  • ogni valore di attributo deve essere tra doppi apici
  • gli elementi non devono sovrapporsi
  • i commenti non possono essere annidati nè inseriti all'interno di tag
  • due attributi non possono avere lo stesso nome
Oltre a queste, ci sono altre regole che il vostro parser vi indicherà in caso di documenti non ben formati.



DTD


La validazione di un documento avviene attraverso le DTD (Document Type Definition), che descrivono come i vari tag XML debbano essere inseriti, in quale ordine e numero, secondo regole più o meno rigide; per capire subito l'utilità di una DTD vediamo un esempio applicato al sorgente iniziale:
<!ELEMENT testo (capitolo, nota) >
<!ELEMENT capitolo (paragrafo)+ >
<!ELEMENT paragrafo (#PCDATA) >
<!ELEMENT nota (#PCDATA) >

Questa breve DTD indica come deve essere composto il nostro documento. Quando il sorgente ripsetta una DTD si parla di doucmento XML valido. Essere non valido è meno bloccante dell'essere non ben formato, perchè nel primo caso dipende dall'applicazione che utilizza il sorgente, mentre nel secondo è proprio il parser a non accettare errori.
Analizzando la DTD, vediamo che e' composta da dichiarazioni di elemento, che identificano gli elementi XML e cosa devono contenere; la DTD in oggetto potrebbe essere tradotta così:

l'elemento testo deve contenere prima un elemento capitolo, poi un elemento nota
l'elemento capitolo deve essere formato da almeno un elemento paragarafo
l'elemento paragrafo contiene caratteri alfanumerici
l'elemento nota contiene caratteri alfanumerici

Nella dichiarazione di elemento per il tag capitolo, abbiamo utilizzato un operatore +, che ha la funzione di indicare che l'elemento che lo precede deve essere presente una o più volte. Altri operatori di questo tipo sono:

? zero o una volta
* zero, una o più volte

Un altro operatore interessante è |, che si utilizza per indicare una scelta. Se nel nostro sorgente XML volessimo dare la possibilità all'elemento <capitolo> di contenere o un elemento <paragrafo> o un elemento <sezione> (non presente nel sorgente in esempio), scriveremmo:
<!ELEMENT capitolo (paragrafo+ | sezione) >
..........
<!ELEMENT sezione (#PCDATA) >

........
Attrverso l'uso delle parentesi tonde e degli operatori appena esposti, possiamo creare DTD eleborate.
Lasciando in sopseso la discussione sulla composizione delle DTD, vediamo come all'interno di un documento XML indichiamo la DTD con cui confrontare il sorgente. Si utilizza una dichiarazione di tipo del documento; un esempio:
<!DOCTYPE testo SYSTEM "testo.dtd" >

L'istruzione precedente, inserita dopo il tag iniziale <?xml ... ?>, ci dice che l'elemento root è testo e che la DTD può essere trovata sulla stessa macchina e stessa directory nel file testo.dtd. Possiamo anche utilizzare un percorso relativo o un percorso web:
<!DOCTYPE testo SYSTEM "/DTD/testo.dtd" >

<!DOCTYPE testo SYSTEM "http://sito/dir/testo.dtd" >
LA DTD può anche essere divisa in parti: possiamo avere un sottoinsieme interno, contenuto all'interno del sorgente XML, mentre un'altra parte viene definita in un file esterno.
Una DTD completamanete interna al sorgente (si veda l'attributo standalone del tag iniziale, che avra' valore yes) si presenterà come nell'esempio seguente:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<!DOCTYPE testo [

    <!ELEMENT testo (capitolo, nota) >
    <!ELEMENT capitolo (paragrafo)+ >
    <!ELEMENT paragrafo (#PCDATA) >
    <!ELEMENT nota (#PCDATA) >

]>
<!-- questo sorgente ha una DTD definita internamente -->
<testo>
    <capitolo>
        <paragrafo>Primo paragrafo</paragrafo>
        <paragrafo>Secondo paragrafo</paragrafo>        
    </capitolo>    
    <nota>Nota</nota>

</testo>
Indentate sempre il codice per renderlo pulito, ed utilizzate commenti che aiutino nella comprensione del sorgente.
All'interno della DTD, #PCDATA indica che il contenuto dell' elemento a cui è associato è composto da caratteri. Altri tipi di contenuto:
  • EMPTY (elemento vuoto)
  • ANY (qualsiasi contenuto)
Sin qui abbiamo visto le basi dell'XML, come comporre un documento ben formato e valido.
Nel prossimo articolo vedremo come ampliare una DTD con l'inserimento di attributi, i tipi di dati degli attributi e lo XML Schema.
Nel terzo articolo studieremo la visualizzazione, con i CSS e con XSL.
See you!


Commenti (6)2004-04-27

14/09/2017 - generic_cialis scrive:
Hello! cialis online , cialis generic , generic cialis , cheap viagra , cialis online ,
03/09/2017 - payday_loans scrive:
Hello! payday loans , payday loans , payday loans , payday loans ,
26/08/2017 - cialis scrive:
Hello! cialis , buy cialis , viagra , cialis ,
24/08/2017 - viagra_online scrive:
Hello! generic cialis , viagra online , cialis , buy viagra online ,
09/08/2017 - _cialis scrive:
Hello! cialis , payday loans , cialis ,
15/06/2017 - cheap_viagra scrive:
Hello! cheap viagra ,