• Super User

    [Pillola] Lettura di un file xml

    Mentre facevo un lavoro in PHP ho realizzato una funzione che spero possa essere utile a qualcun altro.
    Dato in input un file xml ne legge tutto l'albero riportando il nome e il contenuto di tutti i nodi e gli attributi, sfruttando le funzionalità DOM di PHP.

    La posto di seguito:

    [php]function xmltree ($nodo, $p)
    {
    $p++;
    $rientro = str_repeat(" > ", $p);
    $figli = $nodo->childNodes;
    foreach ($figli as $figlio)
    {
    if ($p == 1) echo "<hr>";
    echo "<br><br>$rientro Nodo: ".$figlio->nodeName;
    if ($figlio->hasAttributes())
    {
    echo "<br>$rientro Attributi: ";
    $attributi = $figlio->attributes;
    foreach ($attributi as $attributo)
    {
    echo "$rientro Nome attributo: ".$attributo->name;
    echo " Valore: ".$attributo->value;
    }

            }
            if ($figlio->hasChildNodes()) xmltree ($figlio, $p);
            else echo " Contenuto del nodo: ".$figlio->nodeValue;
        }
    }[/php]Un esempio di chiamata può essere (file.xml deve essere sostituito con il nome e/o percorso del vostro file).
    

    [php]
    $dom = new DOMDocument();
    $dom -> preserveWhiteSpace = false;
    $dom -> load (file.xml);

    $root = $dom ->documentElement;
    if ($root->hasChildNodes())    xmltree ($root, 0);
    

    [/php]


  • User Attivo

    Grande Gorka!

    Molto utile, grazie..

    Quando rimetto le mani sul mio pc, per arricchire il topic, posterò una versione che utilizzo in un mio sito.

    Inseriremo questo topic nella raccolta di thread utili per evitare che si perdà 😉

    Grazie

    🙂


  • Super User

    Ho trovato il primo bug! 😄

    In un pezzo di XML di questo tipo:

     <categorie>
      - <![CDATA[ustensiles de cuisine   ]]> f(clean);  
    
    
    

    considera due nodi diversi <categorie> e <![CDATA> :mmm:

    Se qualcun altro può fare delle prove su xml complessi sarebbe una buona cosa, così lo miglioriamo tutti insieme.