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&amp;sez=news"> News </riga>
     <riga url="index.php?page=home&amp;sez=guest"> Guestbook </riga>
     <riga url="index.php?page=home&amp;sez=varie"> Varie  </riga>
   </voci>
  </sezione>
  <sezione value="uni">
   <voci>
     <riga url="index.php?page=uni&amp;sez=fis"> Fisica </riga>
     <riga url="index.php?page=uni&amp;sez=log"> Logica  </riga>
     <riga url="index.php?page=uni&amp;sez=reti"> Reti di Calcolatori  </riga>
     <riga url="index.php?page=uni&amp;sez=sic"> Sicurezza </riga>
     <riga url="index.php?page=uni&amp;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...