Guida XmL DOM
La vista ad albero del DOM su XML
			
Il DOM rappresenta i documenti come una struttura ad albero e definisce la vista logica sui dati:
  - Tutti i nodi dell'albero hanno una relazione tra loro.
  - Tutti i nodi sono accessibili attraverso l'albero.
  - Il loro contenuto può essere modificato o cancellato, e nuovi elementi possono essere creati.
  - L'albero dei nodi mostra l'insieme di nodi, e le connessioni tra di loro.
  - L'albero inizia dal nodo radice e rami verso i nodi di testo al livello più basso della struttura:

Vediamo un esempio completo di un documento XML: "Libreria.xml"

<?xml version="1.0" encoding="ISO-8859-1"?>
<libreria>
  <libro categoria="classici">
    <titolo lingua="it">Odissea</titolo>
    <autore>Omero</autore>
    <anno>720 a.C.</anno>
    <prezzo>30.00</prezzo>
  </libro>
  <libro categoria="bambini">
    <titolo lingua="it">Pinochio</titolo>
    <autore>Collodi</autore>
    <anno>1883</anno>
    <prezzo>25.00</prezzo>
  </libro>
  <libro categoria="web" copertina="Cartabianca">
    <titolo lingua="it">Applicazioni XML</titolo>
    <autore>Azzurro Romolo</autore>
    <anno>2012</anno>
    <prezzo>29.45</prezzo>
  </libro>
  <libro categoria="web">
    <titolo lingua="it">XmL DOM</titolo>
    <autore>Rossi Mario</autore>
    <autore>Bianchi Luigi</autore>
    <autore>Verdi Alfio</autore>
    <autore>Giallo Paolo</autore>
    <autore>Amaranto Carlo</autore>
    <anno>2013</anno>
    <prezzo>19.00</prezzo>
  </libro>
</libreria
  

Rappresentazione ad albero del frammento (primo libro) di "Libreria.xml"

immagine if

In un albero XML, i termini genitore, figlio e fratello sono usati per descrivere le relazioni. - I nodi dell'albero hanno una relazione gerarchica tra loro - Il nodo superiore è chiamata la radice - Ogni nodo, tranne la radice, ha esattamente un nodo padre - Un nodo può avere qualsiasi numero di figli - I nodi principali hanno figli - Una foglia è un nodo senza figli - I figli allo stesso livello sono chiamati fratelli - Fratelli sono i nodi con lo stesso genitore

Preparazione degli ESEMPI PRATICI

Per la struttura ad oggetti dell'interfaccia DOM verrà usata la notazione standard per i linguaggi ad oggetti: nomeoggetto.metodo(parametri del metodo) nomeoggetto.proprieta nomeoggetto.attributo ecc... Proprietà e metodi definiscono l'interfaccia di programmazione per il modello DOM XML. L'interfaccia di programmazione per il DOM è definito da proprietà e metodi standard-stabiliti dal W3C come già detto. - Le Proprietà sono indicate come qualcosa che è (cioè: nomeNodo è "libro"). - I metodi sono indicati come qualcosa che viene fatto (cioè: creare, modificare, cancellare... "libro"). Tutti i maggiori browser hanno un parser XML incorporato per leggere e manipolare i file.xml. Il parser XML legge il file.xml e lo converte in un oggetto DOM XML, poi rende l'oggetto DOM XML accessibile a Javascript. Tuttavia, prima che un documento XML possa essere letto e manipolato, deve essere caricato in un oggetto DOM XML. Scriviamo il codice per caricare documenti XML in una funzione caricaXml(): function caricaXml(nomeFile) { if (window.XMLHttpRequest) { xhttp=new XMLHttpRequest(); } else { xhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xhttp.open("GET",nomeFile,false); xhttp.send(); return xhttp.responseXML; } Memorizziamo la funzione in un file esterno chiamato "caricaXml.js" che verrà caricato nella sezione <head> di una pagina HTML. Quindi, la funzione caricaXml() potrà essere chiamata da uno script della pagina principale. Come documento XmL useremo in tutti gli esempi, il file "Libreria.xml" e una pagina principale "esempio01.php" che cambierà di volta in volta in funzione dell'esempio corrente. NOTA: Se si usa il browser firefox si può usare una cartella del file system sul desktop, altrimenti occorre un qualunque serverHTTP, anche se tutte le operazione verranno svolte lato CLIENT da JavaScript. Stabiliamo dunque una cartella, e mettiamoci dentro i file: "Libreria.xml", "caricaXml.js" ed "esempio01.php" che creeremo di volta in volta.

L'intero documento XML è formato da Nodi

Dato che, dal punto di vista del modello a oggetti del DOM: - L'intero documento XML è formato da nodi; - Ogni elemento XML è un nodo elemento; - Il testo negli elementi XML sono i nodi di testo; - Ogni attributo è un nodo attributo; - I commenti sono nodi di commenti; - a ogni tipo di NODO è associato un numero identificatore. Il nostro primo esempio cercherà di sperimentare quanto appena detto sul file Libreria.xml costruiamo il seguente file: esempio01.php: Tipo del Nodo <!DOCTYPE html> <html lang="it"> <head> <title>esempio01</title> <meta charset="ISO-8859-1"> <script type="text/javascript" src="caricaXml.js"></script> </head> <body> <script> xmlDoc=caricaXml("Libreria.xml"); document.write("Nodename: " + xmlDoc.nodeName); document.write(" (nodetype: " + xmlDoc.nodeType + ")<br>"); x=xmlDoc.documentElement; document.write("Nodename: " + x.nodeName); document.write(" (nodetype: " + x.nodeType + ")<br>"); y=x.childNodes; for (i=0;i<y.length;i++) { document.write("Nodename: " + y[i].nodeName); document.write(" (nodetype: " + y[i].nodeType + ")<br>"); for (z=0;z<y[i].childNodes.length;z++) { document.write("Nodename: " + y[i].childNodes[z].nodeName); document.write(" (nodetype: " + y[i].childNodes[z].nodeType + ")<br>"); } } </script> </body> </html> in uscita per ogni tipo di nodo avremo il suo corrispondente numero stabilito dal W3C: Nodename: #document (nodetype: 9) Nodename: libreria (nodetype: 1) Nodename: #text (nodetype: 3) Nodename: libro (nodetype: 1) Nodename: #text (nodetype: 3) Nodename: titolo (nodetype: 1) Nodename: #text (nodetype: 3) Nodename: autore (nodetype: 1) Nodename: #text (nodetype: 3) Nodename: anno (nodetype: 1) Nodename: #text (nodetype: 3) Nodename: prezzo (nodetype: 1) Nodename: #text (nodetype: 3) Nodename: #text (nodetype: 3) Nodename: libro (nodetype: 1) ... ... ...
esempio02.php: Valore del Nodo <!DOCTYPE html> <html lang="it"> <head> <title>esempio02</title> <meta charset="ISO-8859-1"> <script type="text/javascript" src="caricaXml.js"></script> </head> <body> <script> xmlDoc=caricaXml("Libreria.xml"); document.write("Nodename: " + xmlDoc.nodeName); document.write(" (value: " + xmlDoc.childNodes[0].nodeValue + ")<br>"); x=xmlDoc.documentElement; document.write("Nodename: " + x.nodeName); document.write(" (value: " + x.childNodes[0].nodeValue + ")<br>"); y=xmlDoc.documentElement.childNodes; for (i=0;i<y.length;i++) { if (y[i].nodeType!=3) { document.write("Nodename: " + y[i].nodeName); document.write(" (value: " + y[i].childNodes[0].nodeValue + ")<br>"); for (z=0;z<y[i].childNodes.length;z++) { if (y[i].childNodes[z].nodeType!=3) { document.write("Nodename: " + y[i].childNodes[z].nodeName); document.write(" (value: " + y[i].childNodes[z].childNodes[0].nodeValue + ")<br>"); } } } } </script> </body> </html> in uscita avremo il valore di ogni tipo di nodo: Nodename: #document (value: null) Nodename: libreria (value: ) Nodename: libro (value: ) Nodename: titolo (value: Odissea) Nodename: autore (value: Omero) Nodename: anno (value: 720 a.C.) Nodename: prezzo (value: 30.00) Nodename: libro (value: ) Nodename: titolo (value: Pinochio) Nodename: autore (value: Collodi) Nodename: anno (value: 1883) Nodename: prezzo (value: 25.00) Nodename: libro (value: ) Nodename: titolo (value: XmL DOM) Nodename: autore (value: Rossi Mario) Nodename: autore (value: Bianchi Luigi) Nodename: autore (value: Verdi Alfio) Nodename: autore (value: Giallo Paolo) Nodename: autore (value: Amaranto Carlo) Nodename: anno (value: 2013) Nodename: prezzo (value: 19.00) Nodename: libro (value: ) Nodename: titolo (value: Applicazioni XML) Nodename: autore (value: Azzurro Romolo) Nodename: anno (value: 2012) Nodename: prezzo (value: 29.95)

Ricerca del Tipo del Nodo

esempio03.php: Proprietà Nodo cicla e cerca elementiNodo figli di typo 1 <!DOCTYPE html> <html lang="it"> <head> <title>esempio02</title> <meta charset="ISO-8859-1"> <script type="text/javascript" src="caricaXml.js"></script> </head> <body> <script> xmlDoc=caricaXml("Libreria.xml"); x=xmlDoc.documentElement.childNodes; for (i=0;i<x.length;i++) { if (x[i].nodeType==1) { //Processa solamente elementiNode(type 1) document.write(x[i].nodeName); document.write("<br>"); } } </script> </body> </html> in uscita avremo i corrispondenti valori(type 1) che sono appunto i quattro elementi libro : libro libro libro libro