ma xche usare strani sistemi quando ci sono i comodissimi parser xml?

rinco personalmente mi trovo meglio con
http://it2.php.net/manual/it/ref.dom.php

che è un parser XML w3c compliant (se hai usato il parser w3c compliant di un altro linguaggio i metodi/proprietà/costanti/ecceccecc sono identici)

se non lo hai fatto ...

codice:
<?php
$menuData = array();
$menuID = 0;
$menuLinkID = 0;

$menuXmlDocument = new DOMDocument();
$menuXmlDocument->load("menu.xml");

// Cicla i nodi di recordset
$mxdMenuNode = $menuXmlDocument->firstChild->firstChild;
while(!is_null($mxdMenuNode))
{
    switch ($mxdMenuNode->nodeType)
    {
        case XML_ELEMENT_NODE:
            
            $menuData[] = array();
            $menuID = count($menuData) - 1;
            
            $menuLinkID = 0;
            
            // Cicla l'elenco dei link
            $mxdMenuSubNodes = $mxdMenuNode->firstChild;
            while(!is_null($mxdMenuSubNodes))
            {
                switch ($mxdMenuSubNodes->nodeType)
                {
                    case XML_ELEMENT_NODE:
                        
                        switch ($mxdMenuSubNodes->nodeName)
                        {
                            case 'name':
                                
                                // Imposta il nome del menu nell'array
                                $menuData[$menuID]['name'] = $mxdMenuSubNodes->nodeValue;
                                break;
                                
                            case 'link':
                                
                                // Acquisisce le informazioni sul link
                                if (!isset($menuData[$menuID]['links']))
                                {
                                    $menuData[$menuID]['links'] = array();
                                }
                                
                                // Inizializza il container delle informazioni del link e
                                // salva l'id dell'elemento appena creato
                                $menuData[$menuID]['links'][] = array('name' => '', 'url' => '');
                                $menuLinkID = count($menuData[$menuID]['links']) - 1;
                                
                                // Cicla i sotto nodi dell'elemento link per estrarre le proprietà 
                                // del link stesso
                                $mxdLinkSubNodes = $mxdMenuSubNodes->firstChild;
                                while(!is_null($mxdLinkSubNodes))
                                {
                                    switch ($mxdLinkSubNodes->nodeType)
                                    {
                                        case XML_ELEMENT_NODE:
                                            
                                            switch ($mxdLinkSubNodes->nodeName)
                                            {
                                                case 'name':
                                                    
                                                    $menuData[$menuID]['links'][$menuLinkID]['name'] = $mxdLinkSubNodes->nodeValue;
                                                    break;
                                                    
                                                case 'url':
                                                    
                                                    $menuData[$menuID]['links'][$menuLinkID]['url'] = $mxdLinkSubNodes->nodeValue;
                                                    break;
                                            }
                                            
                                            break;
                                    }
                                    
                                    $mxdLinkSubNodes = $mxdLinkSubNodes->nextSibling;
                                }
                                
                                break;
                        }
                        
                        break;
                        
                }
                
                $mxdMenuSubNodes = $mxdMenuSubNodes->nextSibling;
        }
    }
    
    $mxdMenuNode = $mxdMenuNode->nextSibling;
}

echo "<pre>";
print_r($menuData);

?>
questo codice ti riporta il un file XML (simile a quello tuo) sotto forma di array ... l'input è

codice:
<?xml version="1.0" ?>
<recordset>
    
    <menu>
        
        <name>NewsLetter</name>
        
        <link>
            <name>Link newsletter1</name>
            <url>#</url>
        </link>
        
        <link>
            <name>Link newsletter2</name>
            <url>#</url>
        </link>
        
        <link>
            <name>Link newsletter3</name>
            <url>#</url>
        </link>
        
    </menu>
    
    <menu>
        
        <name>News</name>
        
        <link>
            <name>Link news1</name>
            <url>#</url>
        </link>
        
        <link>
            <name>Link news2</name>
            <url>#</url>
        </link>
        
    </menu>
    
</recordset>
l'output
codice:
Array
(
    [0] => Array
        (
            [name] => NewsLetter
            [links] => Array
                (
                    [0] => Array
                        (
                            [name] => Link newsletter1
                            [url] => #
                        )

                    [1] => Array
                        (
                            [name] => Link newsletter2
                            [url] => #
                        )

                    [2] => Array
                        (
                            [name] => Link newsletter3
                            [url] => #
                        )

                )

        )

    [1] => Array
        (
            [name] => News
            [links] => Array
                (
                    [0] => Array
                        (
                            [name] => Link news1
                            [url] => #
                        )

                    [1] => Array
                        (
                            [name] => Link news2
                            [url] => #
                        )

                )

        )

)
il codice può sembrare mastodondico ... ma in compenso:
- dove vai vai ... se c'è un parser W3C compliant ... vai tranquillo (al MAX cambia la nomenclatura, ovvero la forma delle proprietà e dei metodi (invece di essere childNodes sarà child_nodes))
- ti da la flessibilità che l'xml ti permette ... ad aggiungere un qualsiasi supporto aggiuntivo da qualche parte hai bisogno di pochissimissime righe di codice ^^
E se vuoi cambiare il formato del file, una volta scritto il codice la prima volta, si tratta solo di spostare il codice che fa l'estrazione e di cambiare il nome dei nodi ... infatti le operazioni sono sempre uguali ... mentre altri sistemi che non implicano l'uso di un parser XML ti complicherebberò infinitamente la vita (dovresti buttare tutto il codice o quasi [dipende dall'entità della modifica al codice xml] e riscriverlo)


per gestire anche la ricorsione (ovvero menu di sotto menu di sotto menu) è da cambiare un po xche x evitare la ricorsione deve usare un'array che contenga array di nodi, in modo mettere tutto in lista. L'array deve avere una struttura tale da contenere sia l'elenco di nodi sia il nodo che li contiene, ma per questa seconda cosa si dovrebbe poter usare la proprietà parentNode e si dovrebbe risolvere il problema abb. velocemente.
Per agganciare le due cose in un array personalmente ti consiglio o di usare un HASH dell'oggetto nodo padre.
Tra quello che mi hai detto stamani e quello che leggo adesso non ho molto chiaro quello che devi fare (mi avevi parlato di ricorsione ma ricorsione nel file xml non ne ho visto)

cmq ti consiglio di "srotolare" i loop ricorsivi xche si macinano la macchina soprattutto per lo stack e la memoria usata. Per i tempi di esecuzione non so se cambia qualcosa e se si quanto cambia anche se in realtà non ci dovrebbe essere tantissima differenza (ma a livello di performance solamente)