Sto affrontando da qualche giorno il mondo di XML (dopo che sono riuscito a far andare anche XSL grazie alla risposta su questo forum) e sto cercando di utilizzarlo un po' per il mio sito personale.
Ora. Ho deciso di fare un XML che gestisse il menù delle pagine.
L'XML è qualcosa del genere:
codice:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="menu.xsl"?>
<menu>
<sezione value="home">
<voci>
<riga url="index.php"> Home </riga>
<riga url="index.php?page=home&sez=news"> News </riga>
<riga url="index.php?page=home&sez=guest"> Guestbook </riga>
<riga url="index.php?page=home&sez=varie"> Varie </riga>
</voci>
</sezione>
<sezione value="uni">
<voci>
<riga url="index.php?page=uni&sez=fis"> Fisica </riga>
<riga url="index.php?page=uni&sez=log"> Logica </riga>
<riga url="index.php?page=uni&sez=reti"> Reti di Calcolatori </riga>
<riga url="index.php?page=uni&sez=sic"> Sicurezza </riga>
<riga url="index.php?page=uni&sez=cps"> Statistica </riga>
</voci>
</sezione>
</menu>
Ora. In base alla pagina nella quale mi trovo, indicata da $_GET['page'], vorrei sottomettere all'XSLT solo il "pezzo" dell'XML riferito alla pagina nella quale mi trovo.
Dato che la selezione avviene dinamicamente, non credo si possa fare da XSL e quindi devo premunirmi in PHP per differenziare l'XML da dare in pasto all'XSL.
Ho pensato quindi di usare DOM che mi permette di gestire i file XML come fossero degli alberi. L'idea è quindi quella di "costruire" una XML temporaneo in memoria con solo la parte che mi serve e quindi darla in pasto all'XSL.
Ho deciso quindi di utilizzare DOM dato che devo leggere da una parte e ricostruire dall'altra.
Tuttavia mi trovo qualche problema quando devo gestire gli oggetti che vengono fuori perché spesso mi trovo ad avere, per esempio, oggetti di tipo ELEMENTS invece che NODES e quindi le funzioni vanno a fare operazioni sui nodi, non funzionano.
Ecco un pezzo di codice che ho fatto:
codice:
$documento = file_get_contents("xml/menu.xml");
if (!$menu = domxml_open_mem ($documento)) {
echo "Error while parsing the document\n";
exit;
}
$nodi = $menu -> get_elements_by_tagname ("sezione");
foreach ($nodi as $oggetto)
if ( ($oggetto->get_attribute("value")) == $_GET['page'])
break;
Nel codice sopra, apro ovviamente il file menu.xml e quindi cerco la sezione "sezione" che mi restituisce un vettore di DOMELEMENTS.
Poi scorro il vettore e cerco quello che ha come attributo, la pagina nella quale mi trovo. Il codice fin qui funziona permettamente. Il ciclo esce e nella variabile oggetto mi trovo il DOMELEMENTS richiesto.
Il problema viene ora. Io mi sono detto. Bene. Adesso creo la mia nuova versione temporanea del file menu.xml e ci appendo questo nodo che si porta dietro il tocco che mi serve.
Il codice di creazione del primo pezzo della versione temporanea del file menu è questo:
codice:
$new_menu = domxml_new_doc ("1.0");
$root = $new_menu -> create_element("menu");
$root = $new_menu->append_child($root);
// $sezione = $root->append_child ($oggetto);
//$new_menu -> dump_file ("test.xml",false, false);
La prima riga commentata è stato il mio primo tentativo andato purtroppo a vuoto in quanto DOM mi avverte che "oggetto" appartiene ad un altro documento e non posso appenderlo a questo.
Giusta obiezione, credo, e quindi mi dico. Beh. Mi faccio una copia di "oggetto" e la appendo.
Vado a vedere le istruzioni di DOM e trovo dump_node
peccato che quando gli do in pasto "oggetto" mi dice che lui vuole un DOMNODE e non un DOMELEMENTS.
Però a conti fatti anche sezione è un nodo o forse con nodo si intede quello terminale ovvero le foglie?
Non demordo e quindi tento di avvalorare l'ipotesi che lui consideri NODO solo le foglie e nel mio caso è riga.
Quindi mi armo del mio "oggetto" e ci faccio un get_elements_by_tagname dato che non esiste un get_node_by_tagname e non esiste nessuna possibile funzione di conversione (o casting degli oggetti).
Ecco quindi che ottengo un vettore con le righe. Provo quindi a fare nuovamente un dump ma anche questa volta fallisco perché lui vuole nodi.
Ora. Come caspita faccio a ottenere dei nodi se non esistono funzioni di conversione e le funzioni di creazioni si limitano a create_elements?!!
Spero di non avervi tediato troppo ma sinceramente dopo innumerevoli altri tentativi, inizio a essere stanco...
Grazie e alla prossima...