Quando si sentii il bisogno di accedere e modificare il contenuto di una pagina HTML direttamente, senza dover per forza utilizzare un editor testuale piuttosto che uno WYSIWYG, allora si pensò al DOM.
Le linee guida dettate dal W3C hanno permesso ad i vari linguaggi di scripting e di programmazione di adeguarsi a questo nuovo modo di manipolare i documenti. Con l’avvento del DOM si aprì l’era del Dynamic HTML o DHTML, documenti ipertestuali che hanno la capacità di modificare alcuni comportamenti in maniera dinamica, grazie all’ausilio di script.
Tuttavia, si fa un massiccio utilizzo del DOM per la creazione, la lettura e la manipolazioni di documenti XML; ed è di questo che parleremo in questo articolo.
Ammettiamo di dover comunicare con un applicazione esterna al nostro sito, che accetta richieste XML da inviare ad un web service. Ora, non entriamo nel merito della connessione, di come inviare le richieste, ecc… (magari ne parlerò in un prossimo articolo). In genere, la software house dell’applicazione esterna al nostro sito, ci fornirà uno schema (è inglese e si legge schima ndr.) del tracciato XML da dover inviare, ed uno o più schemas del tipo di risposte che possiamo avere.
Nostro compito è di implementare lo schema in maniera rapida e funzionale. La strada più banale sarebbe quella di scrivere i vari TAG dello schema XML a mano, in questo modo ad esempio:
$XML = "<foo>"; $XML.= "<tag1>Ciao</tag1>"; $XML.= '<tag2 option="ciao ciao" />'; $XML.= "</foo>";
Funziona? Si, funziona, ma forse non è così funzionale. Se, per esempio, la nostra applicazione esterna accettasse solo documenti XML con codifica UTF-8, dovremmo implementare un sistema per codificare il nostro testo; implementando il codice precedente avremmo qualcosa di questo tipo:
$XML = "<foo>"; $XML.= "<tag1>Ciao</tag1>"; $XML.= '<tag2 option="ciao ciao" />'; $XML.= "</foo>"; $XML = utf8_encode($XML);
Funziona? Certo che funziona, ma forse non è così funzionale. Se, per esempio, la nostra applicazione esterna accettasse solo documenti XML 1.0, dovremmo implementare qualcosa di questo tipo, sempre implementando il codice precedente:
$XML = '<?xml version="1.0″?>'; $XML.= "<foo>"; $XML.= "<tag1>Ciao</tag1>"; $XML.= '<tag2 option="ciao ciao" />'; $XML.= "</foo>"; $XML = utf8_encode($XML);
Funziona? Certo che funziona, ma non è funzionale!
L’approccio visto precedentemente, detto approccio procedurale, va bene per risolvere casi poco complessi, per non dire banali. Tuttavia, un approccio più astratto al problema, approccio ad oggetti, dovrebbe essere sempre la scelta preferita; questo perché con un aproccio astratto al problema, saremo in grado di applicare la stessa soluzione a situazioni simili ma di natura diversa.
Tornando al nostro problema, se per una qualsiasi ragione lo standard XML dovesse cambiare, noi dovremmo riscrivere riga dopo riga la nostra implementazione, e questo si traduce in tempi e costi persi. Come, allora, PHP ci viene in aiuto nella manipolazione di documenti XML? Lo fa con una propria implementazione dello standard DOM.
L’estensione DOM di PHP sono una serie di oggetti - o classi di funzioni - che permettono la manipolazione di un documento XML seguendo lo standard W3C DOM 2. In ultima analisi, per utilizzare questo modulo ci basta tenere a “portata di mano” la documentazione sullo standard DOM.
Facciamo un esempio pratico, riscrivendo l’XML precedentemente proposto con gli oggetti:
$DOM = new DOMDocument('1.0′, 'UTF-8′);
$foo = $DOM->createElement('foo');
$tag1 = $DOM->createElement('tag1′);
$tag1->appendChild( $DOM->createTextNode('Ciao') );
$foo->appendChild($tag1);
$tag2 = $DOM->createElement('tag2′);
$tag2->setAttributeNode( new DOMAttr('option', 'ciao ciao') );
$foo->appendChild($tag2);
$XML = $DOM->saveXML($foo);
Potreste obbiettare che abbiamo usato più righe di codice, ma una conclusione del genere è superficiale; analizziamo insieme il perché.
Con la prima riga di codice andiamo ad istanziare l’oggetto che ci permette di manipolare un documento con lo standard DOM. Nel fare la dichiarazione gli diciamo che ci deve fare un documento XML con codifica UTF-8 e di versione 1.0. Sorge la necessità di cambiare la codifica? Niente di più semplice, basta cambiare la dicitura della codifica. Vogliamo che il nostro documento sia nel formato XML 1.1 o qualsiasi altro disponibile? Niente di più semplice, basta cambiare la stringa relativa la codifica.
Le altre righe servono a generare gli elementi (o TAG) del nostro documento. La riga 7 - come tutte le altre che usano la stessa funzione - serve ad “appendere” un contenuto al TAG, nel nostro caso era un testo, quindi abbiamo creato un elemento testo. Una volta creati tutti gli elementi non si deve fare altro che nidificarli nel corretto ordine. Nel nostro caso, tag1 e tag2 erano tutti figli del TAG foo quindi vanno appesi al TAG foo in maniera sequenziale. L’ultima riga di codice serve a stampare il nostro nuovo documento.
Lavorando in questo modo non abbiamo bisogno di conoscere come scrivere un documento XML in un determinato formato, perché sarà l’oggetto DOM a compilare il documento secondo le nostre esigenze. Se un giorno dovessero nascere nuovi formati XML, saranno sicuramente aggiornate anche gli oggetti DOM e quindi noi non dovremmo fare altro che indicare in fase dichiarativa che il nostro documento è XML formato X.Y.
Ovviamente, questa è solo un introduzione all’argomento, una corretta conoscenza dello standard DOM è propedeutico per poter utilizzare le funzionalità DOM di PHP, che tra l’altro sono le stesse anche per JavaScript e Java.
Se è vero che per creare un documento XML è buona norma utilizzare DOM, è altrettanto vero che per leggerlo vale la stessa regola; il DOM infatti offre potenti mezzi per la lettura di un qualsiasi documento XML.














