Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    54

    [PHP-XML] parsing di xml per creare lista

    Salve a tutti,
    sono giorni (4!!!) che sto diventando pazzo per fare il parsing (ricorsivo) dell'xml qui sotto! Cio' che vorrei ottenere e' una lista con i vari tag html, ma proprio non mi riesce! Per ora ho sempre utilizzato la simplexml ma credo di essere andato nella direzione sbagliata... ho problemi infatti ad aprire e chiudere i tag in presenza di figli... Forse sto sbagliando approccio? Vorrei evitare xls... vi riporto il codice scritto sperando in un vostro preziosissimo aiuto

    grazie infinitamente a tutti
    cucca

    Codice PHP:
    foreach($mod as $k=>$v){
      
    $xml simplexml_load_file(MODULES_DIR."/".$k.'/menu.xml');
      
    $result.=get_tree($xml,MODULES_URL."/".$k);
     }
     
    $result.="[/list]\n";

     return 
    $result;
    }


    function 
    get_tree($xml,$baseurl,$sub=0){

     foreach(
    $xml->item as $children){
      if (!
    $children->menu)
       continue;

      if(
    $sub==1){
       
    $result.="\t<ul>\n";
       
    $descr=$children->description;
      }else{
       
    $descr=$children->description;
      }

      
    $result .= "\t[*]\n";

      if (isset(
    $children->link)){
       
    $result .= "\t\t<a href=\"".$baseurl."/".$children->link."\" 
    title=\""
    .$descr."\">".$children->menu."</a>\n";
      } else {
       
    $result .= "\t\t<a href=\"#\" title=\"".$descr."\" 
    class=\"continua\">"
    .$children->menu."</a>\n";
      }

      
    $result .= get_tree($children,$baseurl,1);
      
    $result .= "\t\n";

      if(
    $sub==1)
       
    $result.="\t[/list]\n";
     }

     return 
    $result;


    Codice PHP:
    <?xml version='1.0' standalone='yes'?>
    <menu_item>
        <item>
            <name>Prima Voce</name>
            <menu>Prima Voce</menu>
            <description>Prima Voce</description>
            <link>#</link>
            <item>
                <name>Prima Sotto Voce</name>
                <menu>Prima Sotto Voce</menu>
                <description>Prima Sotto Voce</description>
                <link>#</link>
            </item>    
            <item>
                <name>Seconda Sotto Voce</name>
                <menu>Seconda Sotto Voce</menu>
                <description>#</description>
                <item>
                    <name>Prima SSotto Voce</name>
                    <menu>Prima SSotto Voce</menu>
                    <description>Prima SSotto Voce</description>
                    <link>#</link>
                </item>    
                <item>
                    <name>Seconda SSotto Voce</name>
                    <menu>Seconda SSotto Voce</menu>
                    <description>Seconda SSotto Voce</description>
                    <link>#</link>
                </item>    
                <item>
                    <name>Terza SSotto Voce</name>
                    <menu>Terza SSotto Voce</menu>
                    <description>Terza SSotto Voce</description>
                    <link>#</link>
                </item>    
            </item>
            <item>
                <name>Terza Sotto Voce</name>
                <menu>Terza Sotto Voce</menu>
                <description>Terza Sotto Voce</description>
                <link>#</link>
            </item>
        </item>
    </menu_item>
    cio' che vorrei ottenere:
    Codice PHP:
    <ul class="menuNavigazione">
        [*][
    url="#"]Prima Voce[/url]
        [*][
    url="#"]Seconda Voce[/url]
            <
    ul>
                [*][
    url="#"]Prima Sotto Voce[/url]
                [*][
    url="#"]Seconda Sotto Voce[/url]
                    <
    ul>
                        [*][
    url="#"]Prima SSotto Voce[/url]
                        [*][
    url="#"]Seconda SSotto Voce[/url]
                        [*][
    url="#"]Terza SSotto Voce[/url]
                    [/list]
                
                    [*][
    url="#"]Terza Sotto Voce[/url]
            [/list]
        
        [*][
    url="#"]Terza Voce[/url]
            <
    ul>
                [*][
    url="#"]Prima Sotto Voce[/url]
                [*][
    url="#"]Seconda Sotto Voce[/url]
                [*][
    url="#"]Terza Sotto Voce[/url]
            [/list]
        
        [*][
    url="#"]Quarta Voce[/url]
        [*][
    url="#"]Quinta Voce[/url][/list] 

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    54
    mmm mi sa che ho scritto troppo :master: uppete

  3. #3
    codice:
    <?PHP
        function get_tree($xml,$baseurl,$sub=1) { 
            $result = "";
            foreach($xml->item as $children){
                if (!$children->menu) 
                    continue; 
    
                if( $sub==1 ){ 
                    $result.="<ul>\n"; 
                    $descr=$children->description; 
                }else{ 
                    $descr=$children->description; 
                } 
    
                $result .= "\t[*]\n"; 
    
                if (isset($children->link)){ 
                    $result .= "\t\t<a href=\"".$baseurl."/".$children->link."\" title=\"".$descr."\">".$children->menu."</a>\n";
                } else { 
                    $result .= "\t\t<a href=\"#\" title=\"".$descr."\" class=\"continua\">".$children->menu."</a>\n";
                } 
    
                $result .= get_tree($children,$baseurl,1); 
                $result .= "\t\n"; 
    
                if($sub==1) 
                    $result.="[/list]\n"; 
            } 
    
            return $result; 
        }
    
        $result = "";
        $xml = simplexml_load_file('menu.xml'); 
        $result.=get_tree($xml,""); 
        $result.="[/list]"; 
    
        print $result;
    
    ?>
    è bastato inizializzare $result dove serviva e mettere:
    function get_tree($xml,$baseurl,$sub=1) {
    invece che:
    function get_tree($xml,$baseurl,$sub=0) {

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    54
    grazie LeaderGL, ma purtoppo non ottengo ancora il risultato...

    questo e' cio' che ottengo (l'ho indento per renderlo piu' comprensibile):

    Codice PHP:
    <ul>
        [*][
    url="#"]Prima Voce[/url]
            <
    ul>
                [*][
    url="/sottovoce.php"]Prima Sotto Voce[/url]
            [/list]
            <
    ul>
                [*][
    url="#"]Seconda Sotto Voce[/url]
                    <
    ul>
                        [*][
    url="/sottovoce.php"]Prima SSotto Voce[/url]
                    [/list]
                    <
    ul>
                        [*][
    url="/sottovoce.php"]Seconda SSotto Voce[/url]
                    [/list]
                    <
    ul>
                        [*][
    url="/sottovoce.php"]Terza SSotto Voce[/url]
                    [/list]
                
            [/list]
            <
    ul>
                [*][
    url="#"]Terza Sotto Voce[/url]
            [/list]
        [/list][/list] 
    il problema e' inserisce troppi
    Codice PHP:
    <ul>[/list] 
    ho provato ad implementare una var $sonodentro come argomento alla funzione ma non mi riesco poi a capire quando uscire per chiudere il[/list]

    grazie 1000!!!

  5. #5
    uhm hai ragione :P non avevo notato questo problema...però effettivamente l'algoritmo fa quello che gli è stato detto...xkè nel codice c'è che per ogni "item" apre e chiude un UL e questo non è corretto per il risultato che vuoi ottenere.

    però dovresti fare un controllo se è stato chiuso il precedente <item> altrimenti deve comportarsi diversamente.

    ora provo a farlo

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    54
    Originariamente inviato da LeaderGL
    uhm hai ragione :P non avevo notato questo problema...però effettivamente l'algoritmo fa quello che gli è stato detto...xkè nel codice c'è che per ogni "item" apre e chiude un UL e questo non è corretto per il risultato che vuoi ottenere.

    però dovresti fare un controllo se è stato chiuso il precedente <item> altrimenti deve comportarsi diversamente.

    ora provo a farlo
    infatti questo e' il problema piu' grosso per me! Ora sto provando ad affrontare il problema con dom-xml, senza lavorare sul tag link ma con la gerarchia degli item ma praticamente con dom-xml sono meno di zero e non riesco a ricostruire la gerarchia dei tag...

    grazie infinite del tuo aiuto LeaderGL!!!

  7. #7
    Ciao, io poi ieri mi sono dimenticato di scriverti il codice...ho "risolto" abbastanza presto l'unica cosa è che sarebbe da perfezionare ovvero devi trovare il modo di non far visualizzare gli "<ul>[/list]" inutili...quelli vuoti.

    codice:
    <?PHP
        function get_tree($xml,$baseurl) {
            $result = "";
            $result.="<ul>";
    
            foreach($xml->item as $children){
                if (!$children->menu)
                    continue;
    
                $descr=$children->description;
    
                $result .= "\n\t[*]";
    
                if (isset($children->link)){
                    $result .= "<a href=\"".$baseurl."/".$children->link."\" title=\"".$descr."\">".$children->menu."</a>\n";
                } else {
                    $result .= "<a href=\"#\" title=\"".$descr."\" class=\"continua\">".$children->menu."</a>\n";
                }
    
                $result .= get_tree($children,$baseurl);
                $result .= "\t\n";
            }
    
            $result.="[/list]\n";
            return $result;
        }
    
        $result = "";
        $xml = simplexml_load_file('menu.xml');
        $result.=get_tree($xml,"");
    
        print $result;
    
    ?>
    Questo codice produce questo output:
    codice:
    <ul>
    	[*]Prima Voce
            <ul>[*]Prima Sotto Voce
                <ul>[/list]
                
    [*]Seconda Sotto Voce
                    <ul>[*]Prima SSotto Voce
                        <ul>[/list]
                        
    [*]Seconda SSotto Voce
                        <ul>[/list]
                        
    [*]Terza SSotto Voce
                        <ul>[/list]
                        [/list]
                
    [*]Terza Sotto Voce
                <ul>[/list]
                [/list]
    	[/list]
    che è ok a meno di:
    codice:
    [*]Terza Sotto Voce
                <ul>[/list]
    dove il <ul>[/list]è superfluo...devi cercare di aggiungere qualche condizione che se un determinato ITEM non ha subitem allora non li mette proprio...

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    54
    grande LeaderGL!!!! Non so come ringraziarti!!! Non ti preoccupare dei tag aperti, posso sempre ciclare l'output e togliere "<ul>[/list]" quando lo incontra ;-)

    grazie tantissimo!
    cucca

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.