Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    contare nodi figli di un determinato nodo madre

    Salve a tutti, avrei bisogno di un consiglio, ho un file .xml strutturato con diversi nodi e avrei bisogno di "contare" il numeri di nodi figli che sono contenuti all'interno di un determinato nodo madre. Faccio un esempio:


    codice HTML:
            <nodo idn="1">
                <genere idg="1">Classic Rock</descr>
                <album id="1">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
                <album id="2">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
                <album id="3">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
            </nodo>    
    
            <nodo idn="2">
                <genere idg="2">Hard Rock</descr>
                <album id="4">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
                <album id="5">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
            </nodo>
    Come faccio a contare tutti nodi figli <nome> del nodo <genere idg="2"> escludendo quelli che non appartengono a quel genere? E' possibile passare l'istruzione in PHP? Ho provato con la funzione count ma non ci sono riuscito. Grazie a tutti.

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, c'è qualche errore nella struttura xml
    codice:
    <genere idg="1">Classic Rock</descr>
    ...
    <genere idg="2">Hard Rock</descr>
    controlla prima questi errori.

    Per "navigare" l'xml potresti usare xpath ma non ho capito bene cosa vuoi ottenere.
    Non capisco dove finisce il nodo <genere idg="2"> e quali siano i figli <nome> di tale nodo (precisando che se parliamo di figli, generalmente si intendono quegli elementi discendenti in modo diretto).
    Perciò gli elementi <nome>, che sono figli dei nodi <album>, non sono figli di <genere> (se era quello che intendevi) ma sono, più genericamente, discendenti.

    Puoi chiarire?
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Hai raggione, correggo l'errore (dovuto ad un copia-incolla errato):

    codice HTML:
            <nodo idn="1">
                <genere idg="1">Classic Rock</genere>
                <album id="1">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
                <album id="2">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
                <album id="3">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
            </nodo>    
    
            <nodo idn="2">
                <genere idg="2">Hard Rock</genere>
                <album id="4">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
                <album id="5">
                    <nome>...</nome>
                    <prezzo>...</prezzo>
                    <artista>...</artista>
                </album>
            </nodo>

    Non capisco dove finisce il nodo <genere idg="2"> e quali siano i figli <nome> di tale nodo
    Non so se ho ben capito la domanda, ma il nodo genere serve per descrivere il <nodo idn="2">. Inizia e finisce sulla stessa riga, è il primo nodo e non contiene altri nodi, solo il testo (forse correggendo l'esempio si capisce meglio).

    Per "navigare" l'xml potresti usare xpath ma non ho capito bene cosa vuoi ottenere.
    XPath effettivamente lo uso ma ciò che voglio fare è visualizzare ad esempio una lista degli album (con nome, prezzo e artista) del genere "Hard Rock", quindi i figli del <nodo idn="2">. In poche parole devo ottenere:

    Genere: Hard Rock
    NomeAlbum4 - Prezzo - Artista
    NomeAlbum5 - Prezzo - Artista

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Bene per la correzione.
    Prima però parlavi di "contare" i figli <nome>, mentre ora stai facendo un'altra richiesta. Fammi capire perchè altrimenti rischiamo solo di confonderci a vicenda.

    Se ti serve semplicemente contare i nodi <nome> che stanno dentro i nodi <album> che, a loro volta, stanno in <nodo idn="2">, allora puoi fare una cosa del genere:

    Codice PHP:
    <?php
    $tuoxml 
    = new SimpleXMLElement('<xml>
            <nodo idn="1">
                <genere idg="1">Classic Rock</genere>
                <album id="1"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
                <album id="2"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
                <album id="3"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
            </nodo>
            <nodo idn="2">
                <genere idg="2">Hard Rock</genere>
                <album id="4"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
                <album id="5"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
            </nodo>
            </xml>'
    );

    echo  
    count($tuoxml->xpath('//nodo[@idn="2"]/album/nome'));
    ?>
    Se devi fare un parsing puoi comunque usare xpath ma probabilmente ti servirà anche qualche ciclo.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    XPath effettivamente lo uso ma ciò che voglio fare è visualizzare ad esempio una lista degli album (con nome, prezzo e artista) del genere "Hard Rock", quindi i figli del <nodo idn="2">. In poche parole devo ottenere:

    Genere: Hard Rock
    NomeAlbum4 - Prezzo - Artista
    NomeAlbum5 - Prezzo - Artista
    Vedi un po' così:
    Codice PHP:
    <?php
    $tuoxml 
    = new SimpleXMLElement('<xml>
            <nodo idn="1">
                <genere idg="1">Classic Rock</genere>
                <album id="1"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
                <album id="2"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
                <album id="3"><nome>...</nome><prezzo>...</prezzo><artista>...</artista></album>
            </nodo>
            <nodo idn="2">
                <genere idg="2">Hard Rock</genere>
                <album id="4"><nome>pippo</nome><prezzo>123</prezzo><artista>topolino</artista></album>
                <album id="5"><nome>pluto</nome><prezzo>456</prezzo><artista>paperino</artista></album>
            </nodo>
            </xml>'
    );
            
    $idg 2// id del genere (2 = "Hard Rock")

    $nodo $tuoxml->xpath('nodo[genere[@idg="'.$idg.'"]]'); // seleziono il nodo filtrandolo per il genere
    $str "Genere: <b>".$nodo[0]->genere."</b>"     // registro il "genere"
        
    "<i>(".count($nodo[0]->album)." albums)</i><br>"// registro il numero di albums presenti 

    foreach ($nodo[0]->album as $album){ // ciclo i nodi "album" figli del nodo selezionato
        
    $str.=$album->nome." - "             // registro il nome di questo album
            
    $album->prezzo." &euro; - " // registro il prezzo
            
    $album->artista."<br>";       // registro l'artista
        
    }

    echo 
    $str// stampo la stringa html

    /* ------ Output ------ //

    Genere: Hard Rock(2 albums)
    pippo - 123 € - topolino
    pluto - 456 € - paperino

    // --------------------- */
    ?>
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  6. #6
    Ti ringraziomille per la soluzione, sembra funzioni perfettamente

    Ora ho necessità di fare un altro xml con una struttura simile, ho provato a seguire lo stesso metodo ma credo di aver sbagliato qualcosa dato che non mi da alcun risultato.

    l'xml è questo:
    codice HTML:
    <forumenu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="...">
        <info>
            <web>..</web>
            <tel>...</tel>
            <email>...</email>
        </info>
    
        <menu idm="1">
            <title idt="1">...</title>
            <icon idi="1">...</icon>
            <group idg="1">
                <descr idd="1">...</descr>
                <food id="1">
                    <name>...</name><price>...</price><description>...</description>
                </food>
                <food id="2">
                     <name>...</name><price>...</price><description>...</description>
                </food>
                <food id="3">
                     <name>...</name><price>...</price><description>...</description>
                </food>
            </group>
            <group idg="2">
                <descr idd="2">...</descr>
                <food id="4">
                     <name>...</name><price>...</price><description>...</description>
                </food>
                <food id="5">
                     <name>...</name><price>...</price><description>...</description>
                </food>
            </group>
        </menu> 
        <menu idm="2">
            <title idt="2">...</title>
            <icon idi="2">...</icon>
            <group idg="3">
                <descr idd="3">...</descr>
                <food id="6">
                    <name>...</name><price>...</price><description>...</description>
                </food>
                <food id="7">
                     <name>...</name><price>...</price><description>...</description>
                </food>
                <food id="8">
                     <name>...</name><price>...</price><description>...</description>
                </food>
            </group>
            <group idg="4">
                <descr idd="4">...</descr>
                <food id="9">
                     <name>...</name><price>...</price><description>...</description>
                </food>
                <food id="10">
                     <name>...</name><price>...</price><description>...</description>
                </food>
            </group>
        </menu>
    il php invece è questo:
    Codice PHP:
    //carica il file .xml
    $xml simplexml_load_file('file.xml');

    $idd 4// id del gruppo

    $nodo $xml->xpath('[group[descr[@idd="'.$idd.'"]]');
    $str "Gruppo: <b>".$nodo[0]->descr."</b>" "<i>(".count($nodo[0]->food)." piatti)</i><br>";

    foreach (
    $nodo[0]->food as $food){
        
    $str.=$food->name." - "
            
    $food->price." &euro; - "
            
    $food->description."<br>";    
    }

    echo 
    $str// stampo la stringa html 
    sapresti dirmi dove sbaglio? In questo modo l'output è Gruppo: (0 piatti), mentre io vorrei visualizzare il 4° gruppo.

  7. #7
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    L'espressione che hai postato per xpath è sintatticamente sbagliata e genera un errore, dubito che ti dia un qualche output.

    Ad ogni modo prova così:
    codice:
    $nodo = $xml->xpath('menu/group[descr[@idd="'.$idd.'"]]');
    Ultima modifica di KillerWorm; 08-04-2014 a 23:19
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

Tag per questa discussione

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.