tecnica.gif (746 byte) Tecnica.jpg (9372 byte)Ernesto Damiani (edamiani@tecnet.it)

 

Programmare il Web con DOM

 

Webmaster e programmatori professionisti, ma anche i semplici appassionati, fanno sempre più spesso ricorso agli script per rendere più efficace l'interazione dei visitatori con le loro pagine Web. Tuttavia, la loro gestione non è immune da problemi, primo su tutti quello relativo all'assenza di uno standard. Il World Wide Web Consortium ha deciso di affrontare la questione con DOM (Document Object Model), l'interfaccia di programmazione standard per i documenti HTML e XML

Gli script, eseguiti sul server Web oppure sul browser, hanno un compito fondamentale: modificare o creare l'informazione contenuta nella pagine Web. Alcuni script possono svolgere compiti apparentemente banali, come cambiare il colore delle opzioni dei menu quando il mouse dell'utente passa su di esse, altri si occupano di funzioni più importanti, come la validazione dei dati immessi tramite le form HTML e le connessioni ai database.
Fino a oggi, però, la gestione degli script ha presentato numerosi problemi, alcuni dei quali sembravano praticamente insormontabili. Il più difficile da risolvere è senz'altro la mancanza di standardizzazione: HTML dinamico, JavaScript e Java possono essere usati in molti modi diversi per ottenere gli stessi risultati. Inoltre, anche all'interno di singoli siti, i webmaster sono costretti a realizzare gli script tenendo conto delle differenze tra i vari browser, a scapito della produttività del loro lavoro e dei costi di manutenzione.

Il Document Object Model

Il World Wide Web Consortium (W3C), che si occupa della standardizzazione delle tecnologie per il Web, ha deciso di affrontare il problema alla radice, definendo un'interfaccia di programmazione standard per i documenti HTML e XML.
L'idea che sta alla base della proposta del W3C è semplice: si tratta di seguire la marcatura HTML o XML per scomporre i documenti Web in parti nidificate, ciascuna delle quali corrisponde a un tag HTML o XML, ed è dotata di una serie di funzioni standard per la sua manipolazione.
La scomposizione di un documento testuale in un insieme di parti di questo tipo avviene all'atto del controllo sintattico, o parsing, dei documenti stessi.
Per chi ha familiarità con i linguaggi di marcatura è facile intuire che la struttura di questo insieme corrisponderà quasi sempre a un albero, la cui struttura riflette l'annidamento dei tag. Per esempio, il seguente frammento XML

<person>
<name>
Ernesto </name>
<surname>
Damiani </surname>
</person>

Questa operazione richiede la definizione di un modello a oggetti per i dati del Www: ogni marcatore che compare in un documento corrisponde a un oggetto, e le funzioni standard che il tag mette a disposizione del programmatore costituiscono l'interfaccia standard di quell'oggetto. Per chiamare queste funzioni, il programmatore ricorrerà al linguaggio host che preferisce, come Java o JavaScript; ma la standardizzazione dell'interfaccia garantirà comunque un'elevata uniformità e riutilizzabilità del codice di scripting dei siti.
Il lavoro del W3C è giunto a un primo traguardo con lo sviluppo del level 1 dello standard DOM (Document Object Model), che definisce un'interfaccia applicativa indipendente dalla piattaforma e dal linguaggio host per navigare e manipolare i documenti XML e HTML.
Il testo completo del documento è disponibile all'Url
http://www.w3.org/TR/REC-DOM-Level1
mentre la home page di DOM, ricca di collegamenti interessanti, è
http://www.w3.org/DOM

XML e HTML

A questo punto i lettori più esperti si staranno domandando come mai è stato proposto uno standard di programmazione comune per HTML e XML, viste le differenze fondamentali tra le due tecniche di marcatura, ben note a chi ha seguito gli articoli su XML di Dario De Judicibus comparsi su queste pagine.
La differenza più importante è legata al fatto che HTML è un linguaggio di marcatura, cioè definisce la sintassi d'uso di un insieme di tag prefissato, mentre XML è un linguaggio per definire linguaggi, cioè insiemi di marcatori personalizzati e le loro sintassi di utilizzo. Questa operazione avviene attraverso i Document Type Definition (DTD) che definiscono gli insiemi di marcatori che saranno utilizzati nei documenti e le loro regole di nifidicazione. Per esempio, il marcatore <IMG> in HTML indica sempre un'immagine, mentre può essere usato per delimitare qualunque informazione (o non essere usato affatto) in un DTD XML.
D'altro canto, HTML non prevede l'uso delle entità, che il programmatore XML usa come tecnica fondamentale per includere dati multimediali, come immagini e suoni, nei suoi documenti. Per questi motivi, DOM comprende due sottostandard ben distinti.
Per HTML è stato infatti definito un insieme apposito di interfacce di programmazione (di cui non ci occuperemo in questo articolo) che tengono esplicitamente conto dei marcatori HTML 4.0. Queste interfacce sono ben diverse da quelle previste per XML che come vedremo saranno indipendenti dagli specifici marcatori utilizzati.
Va anche notato che per ora DOM standardizza le interfacce per accedere ai soli documenti XML; versioni future dello standard permetteranno ai programmatori di script di accedere anche ai programmi XSL che accompagnano i documenti, nonché ai loro DTD.

La gerarchia DOM per XML

Veniamo ora alla gerarchia di classi definita dallo standard DOM, riportata nella Tabella 1:

Livello 1 Livello 2 Livello 3 Livello 4
Node (Root) DocumentFragment    
  Document    
  Attr    
  Element    
  DocumentType    
  Notation    
  Entity    
  EntryReference    
  ProcessingInstruction    
  CharacterData Comment  
    Text CDATA section

 

Tabella 1 - La gerarchia DOM Level 1 per XML


Come si può vedere, si tratta di una semplice gerarchia di classi che definisce i tipi di oggetti che fanno parte di un documento XML. Per ciascuno di questi sono disponibili una serie di funzioni di manipolazione standard che ne costituiscono l'interfaccia DOM, richiamabili da programmi Java e ECMAScript (la versione standard di JavaScript)
http://www.ecma.ch/stand/ecma-262.htm
Le classi più usate di questa gerarchia sono
Node, Document, Element, Attr e Text.
Node è la classe più importante, poiché corrisponde a un componente generico di un documento XML e specifica le funzioni base che servono per cancellare, inserire e sostituire nodi nei documenti. Queste funzioni, per ereditarietà, sono così rese disponibili anche a tutte le altre classi della gerarchia.
Oltre a queste funzionalità di base, Node specifica alcune funzioni di navigazione all'interno degli alberi sintattici dei documenti XML. Alcune di queste, come parentNode, firstChild e nextSibling, consentono al programmatore Java e JavaScript di accedere ai marcatori contenuti nel tag corrente e comunque di percorrere il documento XML seguendo il contenimento testuale dei marcatori stessi.
Per aumentare l'efficienza degli script, lo standard prevede anche una funzione NodeList che restituisce un vettore che contiene tutti i figli del nodo corrente, consentendo un accesso veloce a indici al documento.
Per i più esperti, la specificazione completa dell'interfaccia della classe Node, scritta nell'Interface Definition Language di OMG (lo stesso usato per i componenti CORBA), è riportata di seguito:

interface Element: Node{
readonly attribute DOMString tagName;
DOMString getAttribute(in DOMString name);
void setAttribute (in DOMString name, in DOMString value) raises(DOMException);
void removeAttribute(in DOMStringName)
raises(DOMException);
Attr getAttributeNode(in DOMStringName);
Attr setAttributeNode(in Attr NewAttr)
raises(DOMException);
Attr removeAttributeNode4 in Attr NewAttr)
raises(DOMException);
NodeList GetElementsByTagName(in DOMStringName);
void normalize();
}
Interfaccia IDL per la classe Node di DOM


Le classi figlie di Node, che ne ereditano le funzioni base, corrispondono alle parti che siamo ormai abituati a vedere nei documenti XML. Ogni oggetto Element rappresenta infatti un tag XML del documento, mentre Attr rappresenta gli attributi associati agli elementi. Si noti però una precisa scelta dei progettisti del W3C: Attr non è figlio di Element, e per questa classe le funzioni di navigazione parentNode, previousSibling e nextSibling non sono definite. Questo fa sì che uno script, per accedere a un attributo, non debba per forza navigare fino a raggiungere l'elemento corrispondente.
Text rappresenta il contenuto testuale del documento, che in XML viene spesso chiamato character data o CDATA. Quando un documento XML viene convertito nella struttura a oggetti DOM, viene creato un oggetto Text per ogni blocco di testo.
Via via che uno script manipola il documento, inserendo magari nuovi marcatori, possono venire creati nuovi oggetti di questo tipo; per evitare al programmatore di doverne stabilire i punti di separazione, la funzione normalize() dell'interfaccia riporta automaticamente il documento XML in uno stato "corretto" in cui non vi sono elementi di testo adiacenti.
Infine, la classe Document rappresenta il legame della struttura a oggetti DOM con il documento testuale da cui proviene. La sua proprietà ownerDocument precisa infatti il documento XML da cui la struttura DOM è stata ricavata eseguendo il parsing.

Il modello di funzionamento di DOM

A questo punto il modello di funzionamento dello standard DOM dovrebbe essere chiaro: un'applicazione host, posta sul server Web oppure sul browser dell'utente, carica un documento XML e lo converte in una gerarchia di oggetti DOM eseguendone il parsing. Si noti che per svolgere quest'operazione non è assolutamente necessario scrivere codice: sono infatti disponibili ottimi parser di pubblico dominio scritti in Java, compresi quelli di Microsoft, Lotus e IBM, liberamente scaricabili dai rispettivi siti. Una volta che il parser ha creato la struttura DOM, lo script Java o JavaScript definito dal programmatore (che può trovarsi, ancora, sul server Web o sul client, per esempio sotto forma di applet) inizia a chiamare i metodi dell'interfaccia DOM per navigare o modificare il documento, interagendo se necessario con l'utente. Infine, se richiesto, il documento manipolato può essere riconvertito in testo dal parser (mediante un operazione di unparsing) e memorizzato sul server o sul client.
Per chiarire ulteriormente questo scenario, si consideri il semplice documento XML riportato di seguito:

<bibliography>
<article>
<author>
<name> Ernesto Damiani </name>
<email> edamiani@tecnet.it </email>
</author>
<title> Programmare il Web con DOM </title>
<magazine> Internet News </magazine>
<date> Giugno 1999 </date>
</article>
<article>
<author>
<name> Dario De Judicibus </name>
<email> dejudicibus@tecnet.it </email>
</author>
<title> Corso XML</title>
<magazine> Internet News </magazine>
<date> Maggio 1999 </date>
</article>
</bibliography>

Per navigare in JavaScript nella struttura DOM di questo documento, ovviamente dopo aver eseguito il parsing del documento XML, basterà scrivere un codice più o meno come il seguente:

var biblio = document.getElementsbyTagName("bibliography")[0];
var article = document.documentElement.firstChild;
while (article){
var author=article.firstChild;
var authorname=author.firstChild.data;
if (authorname=="Ernesto Damiani") {var title=author.nextSibling;
// inserisci il titolo in un database
}
else if (authorname=="Dario DeJudicibus") {var title=author.nextSibling;
// inserisci il titolo in un altro database
}
article=article.nextSibling;
}

Questo codice non tiene conto delle eventuali chiamate di inizializzazione richieste dallo specifico parser XML, ma risulta comunque abbastanza autoesplicativo. Dopo essersi posizionato all'inizio del documento, lo script ne naviga la struttura sintattica con un ciclo breadth first, ovvero passando da un fratello all'altro del nodo article nell'albero del documento con la funzione nextSibling(). Per ciascun nodo article esaminato nel ciclo, lo script accede con la funzione firstChild()al corrispondente nodo figlio author e al relativo contenuto, leggendo il nome dell'autore e separando i titoli di un autore da quelli di un altro.
Si noti che lo standard DOM non definisce le modalità di accesso ai database; per questo vi sono già appositi standard, come ODBC, di cui ci siamo occupati in altri articoli.

Conclusioni

Lo standard DOM ha acquisito, fin dall'Ottobre del 1998, lo stato di raccomandazione del W3C, il che significa che si tratta ormai di uno standard stabile e che non sarà soggetto a cambiamenti improvvisi. Vari produttori hanno realizzato o stanno realizzando API standard per Java o JavaScript (per ulteriori informazioni, consultate gli Url)
http://www.oasis-open.org/cover/dom.html
e
http://www.xmlsoftware.com
inoltre DOM è alla base delle nuove capacità di gestione di documenti XML che saranno incorporate nei più diffusi pacchetti di elaborazione testi.
Il lavoro di standardizzazione del W3C proseguirà ora verso la definizione di DOM level 2, che permetterà l'accesso da parte degli script anche ai DTD e ai fogli di stile che accompagnano i documenti XML. Con tutta probabilità, DOM sarà alla base anche dei meccanismi esecutivi dei linguaggi di interrogazione per XML, su cui un apposito sottocomitato del W3C è attualmente al lavoro. Per tutti questi motivi è indispensabile che webmaster e programmatori comincino a interessarsene già da oggi.


Internet News è un mensile della Casa Editrice Tecniche Nuove S.p.A.
© 1995/99. Tutti i diritti sono riservati.
Internet News non risponde di eventuali errori e omissioni.
Commenti a: inews@tecnet.it