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

    XML/Php Ordinare i nodi con il valore di un attributo

    Salve a tutti.
    Ho un problema di sorting con un file xml in php.

    Sto cercando di riordinare un file xml (news.xml), che vedete di seguito:

    codice:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <Menu>
    <myItem id="1" name="Item"/> 
    <myItem id="4" name="Item"/>
    <myItem id="2" name="Item"/>
    <myItem id="6" name="Item"/>
    <myItem id="9" name="Item"/>
    </Menu>
    per mezzo di php e di DOMXML:

    Codice PHP:
    <?php
    // creo DOM
    $doc = new DOMDocument();
    $doc->preserveWhiteSpace false;


    // carico XML
    $doc->load("news.xml");
    $root $doc->documentElement;


    // Recupero  tutti gli elementi del nodo myItem
    $news$root->getElementsByTagName('myItem');



    // calcolo la lunghezza dell'Array
    $num $news->length



    // Creo un Array nel quale le chiavi sono i valori dell'attributo id del nodo e i valori sono
    // la posizione attuale nel file xml

    $itemarr = array();

    for (
    $i $i <=$num-$i++){ 

    $itemarr[$doc->getElementsByTagName('myItem')->item($i)->getAttributeNode('id')->value]=$i;

    }

    //Ottengo l'array: Array ( [1] => 0 [4] => 1 [2] => 2 [6] => 3 [9] => 4)


    //Riordino l'array in ordine decrescente (numerico) sulla base delle chiavi (gli "id" all'interno
    //del file XML)

    krsort($itemarrSORT_NUMERIC);

    //Ottengo l'array: Array ( [9] => 4 [6] => 3 [4] => 1 [2] => 2 [1] => 0)


    //Ciclo per riordinare il file xml ponendo gli elementi con l'attributo id più alto in cima 
    //andando a prendere i vari elementi nella posizione originaria del file xml che mi viene 
    //indicata dai  valori degli elementi dell'array e "appendendoli" in sequenza.

    foreach ($itemarr as $item){ 

    $x=$doc->getElementsByTagName('myItem')->item($item);


    $root->appendChild($x);
    }

    // Salvo il documento aggiornato

    print $doc->save("news.xml");
    Anche se arzigogolato... il giochetto sugli array ha un senso logico, il problema è che il file xml aggiornato che viene fuori si ordina senza un "apparente" senso logico. I vari nodi si spostano ma non si ordinano in modo decrescente sulla base degli gli id...

    Ecco cosa mi viene fuori:

    codice:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <Menu>
    <myItem id="2" name="Item"/>
    <myItem id="6" name="Item"/>
    <myItem id="4" name="Item"/>
    <myItem id="9" name="Item"/>
    <myItem id="1" name="Item"/>
    </Menu>
    Avete idea di dove possa essere il problema???
    Vi sarei davvero grato se riusciste a darmi una mano nella risoluzione di questo arcano.
    Grazie mille in anticipo.
    Stefano

  2. #2
    Nessuna idea?

    Io ho pensato anche ad una soluzione diversa...che sembrava pure molto più semplice ma, nemmeno funziona...questa volta non riordina nemmeno il file...lo lascia come era in input...possibile che sia una cosa tanto ostica???

    Codice PHP:
    <?php
    // creo DOM
    $doc = new DOMDocument();
    $doc->preserveWhiteSpace false;


    // carico XML
    $doc->load("news2.rss");
    $root $doc->documentElement;


    // Recupero  tutti gli elementi del nodo myItem
    $news$root->getElementsByTagName('myItem');


    function 
    my_sort($a$b

     
    $compare1strcmp($news->item($a)->getAttributeNode('id')->value$news->item($b)->getAttributeNode('id')->value);  
          return 
    $compare1;
     } 

    usort($news"my_sort");  



    // Salvo il documento aggiornato

    print $doc->save("news2.rss");

    Spero possiate darmi una mano.
    Stefano

  3. #3
    Ciao,

    risolto più il problema??

    mi trovo nella stessa condizione, in più oltre che ordinare i nodi per ID devo fare un controllo in php che mi sposti il nodo selezionato su o giù variando il valore ID

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.