Capitolo 9.   Da HTML a XML (cenni)

Come abbiamo visto all'inizio di queste dispense, l'HTML deriva dall'SGML che è un linguaggio a marcatori molto più potente e complesso, disponibile da molti anni in varie forme e per vari scopi.

L'SGML specifica degli identificatori di contenuto con i quali formattare il testo in modo coerente per permettere ai sistemi di gestione dei documenti di reperire facilmente le informazioni; si presta bene per la gestione di grandi quantità di dati con struttura omogenea come cataloghi, manuali tabelle statistiche.

Siccome usa marcatori basati sul contenuto e non sul formato, è possibile cambiare agevolmente le regole di formattazione per inviare il documento a dispositivi di memorizzazione o di visualizzazione di tipo diverso.

Nonostante questi pregi l'SGML è utilizzato solo da organizzazioni di una certa mole, come l'IBM o alcuni enti statali americani, in quanto è notevolmente complesso e difficile da usare in modo corretto.

Il grande pregio dell'SGML è di non essere solo un linguaggio di formattazione o di contrassegno ma un «metalinguaggio» con il quale si possono definire linguaggi di contrassegno per oggetti molto diversi: formule matematiche, spartiti musicali, formule chimiche, ipertesti (questo è il caso dell'HTML).

In questo capitolo ci occupiamo di uno di tali linguaggi, l'XML (eXtensible Markup Language), che ha ultimamente assunto un ruolo molto importante in numerosi ambiti della gestione e della comunicazione dei dati.

9.1   Limiti dell'HTML

L'HTML conserva traccia delle sue origini soprattutto nella sintassi dei marcatori ma è indubbiamente molto più semplice e molto più limitato nelle funzionalità rispetto a SGML.

Malgrado questo ha svolto un ruolo importante contribuendo in modo decisivo alla diffusione e al successo delle pagine Web presso il grande pubblico.

I limiti più evidenti dell'HTML sono:

E' utile soffermarsi a questo punto sulle caratteristiche che ogni elemento di un documento possiede:

La maggior parte dei tag dell'HTML ha sintassi, semantica, rappresentazione e comportamento predefiniti e quindi i programmi di navigazione dovrebbero essere in grado di trattarli uniformemente; il condizionale dipende dal fatto, più volte evidenziato, che spesso i browser non rispettano gli standard.

Come abbia o già osservato, con il passare degli anni e con la sempre maggiore diffusione, l'HTML si è via via discostato dalla sua natura iniziale di strumento per la definizione della struttura dei documenti, per divenire un linguaggio di formattazione, spostando quindi l'accento dalla semantica alla rappresentazione degli elementi.

Questo è avvenuto malgrado l'introduzione dei CSS che permettono di definire la formattazione della pagina, liberando da questo onere i tag HTML e restituendoli alla loro funzione originale di descrittori del contenuto.

Abbiamo quindi, da una parte un linguaggio ricco di potenzialità, molto rigoroso e versatile ma eccessivamente complesso come l'SGML, dall'altra un linguaggio molto semplice e di larga diffusione ma molto rigido e incoerente come l'HTML; in questo contesto si inserisce il linguaggio XML.

9.2   Genesi e natura dell'XML

XML è un linguaggio a marcatori derivato dall'SGML con lo scopo dichiarato di conservarne l'80% delle potenzialità con solo il 20% della complessità.

E' stato creato da un gruppo di lavoro del W3C coordinato da Tim Berners Lee e si propone come base per gli sviluppi futuri del Web.

Con XML è possibile definire nuovi marcatori (questo è il motivo del termine extensible) e specificare separatamente sintassi, semantica, rappresentazione e comportamento di ogni tag.

Grazie alla possibilità di definire nuovi marcatori si può affermare che anche l'XML, come l'SGML è un metalinguaggio attraverso il quale definire linguaggi da usare in vari ambiti; ad esempio già esistono:

La differenza sostanziale tra HTML e XML è che quest'ultimo si usa per descrivere il significato dei dati e non il loro aspetto; questo è un grosso passo avanti che, insieme alla flessibilità e versatilità del linguaggio, apre prospettive di utilizzo al di là della rappresentazione dei dati nelle reti e nel Web.

L'XML si propone infatti come possibile formato universale per la rappresentazione dei dati superando i cronici problemi di incompatibilità tra formati generati con applicazioni diverse.

Si noti che il nuovo standard per i documenti di ufficio, ODF (Open Document Format) e anche il formato proprietario (non standard) di Microsoft OOXML (Office Open XML) si basano su XML, e sono solo due delle numerose tecnologie informatiche che si appoggiano a tale linguaggio.

Si deve infine notare come l'XML non sia stato concepito per sostituire HTML, ma per integrarlo ed estenderlo, tanto è vero che quest'ultimo può essere reinterpretato nell'architettura XML dando origine ad un nuovo linguaggio: l'XHTML (eXtensible HTML).

9.3   Documenti XML ben formati e validi

Un documento XML è un semplice file di testo, realizzabile quindi con un qualsiasi editor, contenente testo e marcatori; questi ultimi sono racchiusi fra i simboli «<» e «>» come in HTML ma con regole sintattiche molto più rigide:

Un documento che rispetti queste regole si dice «ben formato» o «conforme».

Vediamo un primo esempio di documento XML (biblioteca.xml) in cui si definiscono dati relativi ad una biblioteca usando dei tag definiti liberamente a questo scopo:

<?xml version="1.0" standalone="yes" ?> 
<biblioteca> 
   <libro> 
      <titolo>XML - Le basi</titolo> 
      <autore>S. St. Laurent</autore> 
      <casaed>Tecniche Nuove</casaed> 
      <argomento>Web - XML</argomento> 
      <annoed>1999</annoed> 
   </libro>\011 
   <libro> 
      <titolo>Primi passi con Linux</titolo> 
      <autore>P. D'Ignazio</autore> 
      <casaed>Infomedia</casaed> 
      <argomento>S.O. - Linux</argomento> 
      <annoed></annoed> 
   </libro>
</biblioteca>

L'indentatura, come al solito, serve solo ad aumentare la leggibilità del sorgente.

Si deve notare che il linguaggio è case sensitive, quindi <LIBRO> e <libro> sono tag diversi.

Nel caso di elementi vuoti si può usare la notazione abbreviata:

<annoed></annoed>

può essere sostituito con

<annoed/>

Nell'esempio l'elemento radice è <biblioteca> mentre la prima riga è un po' particolare in quanto rappresenta una istruzione di elaborazione XML; tali istruzioni iniziano con i caratteri «<?» e terminano con «?>».

Questa istruzione presenta due attributi: version il cui ruolo è ovvio e standalone il cui significato verrà chiarito più avanti.

Le regole elencate in precedenza forniscono solo un primo livello di validazione; un secondo livello si ottiene grazie alla DTD (Document Type Definition) che è un testo che descrive le regole sintattiche per il documento XML e può essere contenuto in quest'ultimo oppure, più frequentemente, risiedere in un file autonomo.

La seconda alternativa è ovviamente da preferire in caso di più documenti definiti con una stessa DTD in quanto permette di scrivere quest'ultima una volta sola.

Un documento che rispetti le regole sintattiche di una DTD si dice «valido».

Il file biblioteca.xml deve essere così modificato nella parte iniziale:

<?xml version="1.0" standalone="yes" ?> 
<!DOCTYPE biblioteca [ 
   <!ELEMENT biblioteca (libro+)> 
   <!ELEMENT libro (titolo, autore*, casaed, argomento,annoed?)> 
   <!ELEMENT titolo (#PCDATA)>  
   <!ELEMENT autore (#PCDATA)> 
   <!ELEMENT casaed (#PCDATA)> 
   <!ELEMENT argomento (#PCDATA)> 
   <!ELEMENT annoed (#PCDATA)>
  ]>
<biblioteca> 
<libro> 
......

La DTD può essere esterna e residente, ad esempio, nel file biblioteca.dtd seguente:

<?xml version="1.0" ?> 
<!ELEMENT biblioteca (libro+)> 
<!ELEMENT libro (titolo, autore*, casaed, argomento, annoed?)> 
<!ELEMENT titolo (#PCDATA)>
<!ELEMENT autore (#PCDATA)> 
<!ELEMENT casaed (#PCDATA)> 
<!ELEMENT argomento (#PCDATA)> 
<!ELEMENT annoed (#PCDATA)>

Allora il documento biblioteca.xml assumerebbe questo aspetto:

<?xml version="1.0" standalone="no" ?> 
<!DOCTYPE biblioteca SYSTEM "biblioteca.dtd"> 
<biblioteca> 
   <libro> 
...... 

A questo punto dovrebbe essere chiaro il significato dell'attributo standalone: vale "no" quando almeno una definizione DTD è esterna al documento.

La parola chiave SYSTEM si usa per DTD definite localmente; in certi casi è utile usare DTD pubbliche già definite con questa sintassi:

<!DOCTYPE nome  PUBLIC "nome DTD" "url DTD">

Le linee contenute nella DTD si chiamano «dichiarative», iniziano con i simboli «<!», seguiti dal tipo di dichiarativa e terminano con «>».

Il nome scritto nella dichiarativa !DOCTYPE (che ricordo essere presente anche nei sorgenti HTML) deve coincidere con la radice del documento XML a cui la DTD si riferisce; tra le parentesi quadrate è racchiusa la definizione del documento.

Il tipo !ELEMENT permette di specificare il tipo di elemento; la sua sintassi è:

<!ELEMENT nome contenuto>

Nel nostro esempio il primo elemento ha nome biblioteca e contiene uno o più di uno (questo è il significato del simbolo«+») elementi libro.

A sua volta libro contiene una sequenza di elementi (la sequenza si indica elencando gli oggetti separati da virgola) titolo, autore, casaed, argomento, annoed.

Se invece si dovesse avere la scelta tra una lista di elementi, la sintassi da usare sarebbe: (el1 | el2 | el3 ....).

autore è opzionale e può esserci una o più volte (è il significato del simbolo «*»); PREZZO può esserci zero o una volta (è il significato del simbolo«?»).

Gli altri elementi devono tutti comparire una ed una sola volta.

La parola chiave #PCDATA indica che quell'elemento è un elemento di testo.

Un altro tipo di dichiarativa è !ATTLIST che permette di indicare gli attributi di un elemento, con questa sintassi:

<!ATTLIST nome terna*>

dove «terna» è composta da nome-attributo tipo-attributo valore-default;

ad esempio:

<!ATTLIST argomento
      id        ID           #REQUIRED
      nome-fig  CDATA        #IMPLIED
      visible   (yes | no)   "yes"      >

ID indica l'identificativo del tag e permette di identificarlo univocamente nel documento, CDATA una stringa di testo, #REQUIRED impone che l'attributo sia specificato, #IMPLIED indica che l'attributo non è obbligatorio.

Un altro valore possibile è #FIXED che indica un attributo con valore fisso.

Il terzo tipo di dichiarativa è quello per le entità, !ENTITY che può essere di due tipi: generale o di parametro.

Le entità generali sono definite nelle DTD ma si usano poi nei documenti XML; la loro sintassi è:

<!ENTITY nome definizione>

ad esempio per definire il carattere «&» si usa:

<!ENTITY amp "&#38">

oppure per definire un'entità associata ad un testo ripetitivo da inserire più volte in un documento:

<!ENTITY sost "Questo è il testo sostitutivo">

Il riferimento alle entità si effettua anteponendo il simbolo «&» e posponendo il simbolo «;».

Quindi se in un documento si vuole inserire il testo dell'esempio sopra illustrato si scrive:

&sost;

Le entità di parametro si usano esclusivamente nelle DTD esterne; la loro sintassi è:

<!ENTITY % nome definizione>

Queste entità vengono di solito usate per fare riferimento a definizioni di dati contenute in file esterni.

Non approfondiamo ulteriormente questi argomenti; maggiori dettagli sulle DTD si possono reperire liberamente sul sito del consorzio W3C: <http://www.w3.org>.

9.4   Parser ed applicazioni XML

Come abbiamo visto un documento XML contiene solo la definizione di un insieme di dati ottenuta grazie ad un set arbitrario di marcatori; sorgono a questo punto due problemi:

  1. il documento deve essere analizzato e validato;

  2. i dati devono in qualche modo essere gestiti (ad esempio visualizzati con un browser).

Gli stessi problemi in verità esistono anche per i documenti HTML che però contengono tag appartenenti ad un insieme rigido e prefissato; quindi è bastato costruire in modo opportuno i programmi di navigazione, istruendoli su come interpretare e gestire i vari tag ed i problemi sono stati risolti.

Nel caso dell'XML le cose sono un po' più complicate; la questione della validazione viene affrontata dai parser XML che svolgono le seguenti operazioni:

Esistono due tipi di parser:

Attualmente tutti i browser più recenti sono in grado di effettuare il parsing di un documento XML.

Il problema della gestione dei dati viene invece affrontato dalle applicazioni XML che si occupano di manipolare le informazioni ricevute dal parser trasformandole in elementi di varia natura adatti ad essere visualizzati, stampati, memorizzati o inviati ad altri dispositivi di output.

Nel caso il documento XML debba essere solo visualizzato con un programma di navigazione è possibile ricorrere semplicemente ai CSS, a patto che il browser sia almeno in grado di fare il parsing.

Riprendendo l'esempio biblioteca.xml vediamo un possibile foglio di stile, biblioteca.css, che permette la sua visualizzazione con Firefox:

/* CSS per esempio biblioteca.xml */
biblioteca { background-color: white}
libro { display: block;
        padding-bottom: 0.4in}
titolo { display: block;
         text-align: center;
         color: blue;
         padding: 0.2in;
         font-style: italic;
         font-weight: bold;
         font-size: 18pt}
autore, casaed, argomento, annoed { display: block;
                                   text-align: left;
                                   text-indent: 3.8in;
                                   color: black;
                                   font-size: 12pt}

Per usarlo occorre aggiungere a biblioteca.xml, come seconda linea:

<?xml-stylesheet type="text/css" href="biblioteca.css" ?>

Il risultato che si ottiene aprendo biblioteca.xml con Firefox è quello mostrato nella figura 9.19.

Figura 9.19.

figure/pagine-web-xml-ese0001

Con i fogli CSS si può comunque solo modificare il formato degli elementi XML ed agire solo sui singoli elementi; se si vuole invece manipolare in modo più consistente un documento XML, ad esempio riordinando gli elementi o nascondendone alcuni, si deve ricorrere ai fogli XSL.

L'XSL (eXtensible Style Language) comprende sia un linguaggio di trasformazione, l'XSLT (XSL Transformation), che uno di formattazione, l'XSL:FO (XSL: Formatting Object), entrambi definiti usando XML.

La trattazione sull'uso di questi linguaggi nonché dei linguaggi XLink e XPointer per il collegamento tra documenti XML e anche dell'XMLSchema definito anch'esso in XML e alternativo alle DTD, esula dagli scopi di queste dispense; si rimanda, come al solito, all'ampia letteratura disponibile sull'argomento.