Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di iaco74
    Registrato dal
    Sep 2002
    Messaggi
    682

    XML_DOM accedere a nodi di Array

    Ciao a tutti il titolo forse non e' molto chiaro ma non sapevo come mettere altrimenti.

    Ho la necessita di fare il parsing di un file di questo tipo

    codice:
    <?xml version="1.0" ?> 
      <update_packet tableName="" nullValue="{_NULL_}" transID="IID93119464815:Sat May 29 00:13:53 GMT+0200 2004">
      <update id="IID88087640470">
      <field name="cliente" type="String" oldValue="guido" newValue="carmelo" key="false" /> 
      </update>
      <update id="IID86692974530">
      <field name="cliente" type="String" oldValue="mario" newValue="franco" key="false" /> 
      </update>
      </update_packet>

    Se faccio domxml_xmltree per ricostruire l'albero di questo documento, chiaramente, come si vede anche dal file mi trovo a dover accedere a degli array.....
    Ne posto solo una parte per semplicità
    codice:
    class domdocument {
      var $name = '#document';
      var $url = '';
      var $version = '1.0';
      var $standalone = -1;
      var $type = 9;
      var $compression = -1;
      var $charset = 1;
      var $children = 
      array (
        0 => 
        class domelement {
          var $type = 1;
          var $tagname = 'update_packet';
          var $attributes = 
          array (
            0 => 
            class domattribute {
              var $type = 2;
              var $name = 'tableName';
              var $value = '';
            },
            1 => 
            class domattribute {
              var $type = 2;
              var $name = 'nullValue';
              var $value = '{_NULL_}';
            },
            2 => 
            class domattribute {
              var $type = 2;
              var $name = 'transID';
              var $value = 'IID93119464815:Sat May 29 00:13:53 GMT+0200 2004';
            },
          );
          var $children = 
          array (
            0 => 
            class domelement {
              var $type = 1;
              var $tagname = 'update';
              var $attributes = 
              array (
                0 => 
                class domattribute {
                  var $type = 2;
                  var $name = 'id';
                  var $value = 'IID88087640470';
                },
              );
              var $children = 
              array (
                0 => 
                class domelement {
                  var $type = 1;
                  var $tagname = 'field';
                  var $attributes = 
                  array (
                    0 => 
                    class domattribute {
                      var $type = 2;
                      var $name = 'name';
                      var $value = 'cliente';
                    },
                    1 => 
                    class domattribute {
                      var $type = 2;
                      var $name = 'type';
                      var $value = 'String';
                    },
                    2 => 
                    class domattribute {
                      var $type = 2;
                      var $name = 'oldValue';
                      var $value = 'guido';
                    },
                    3 => 
                    class domattribute {
                      var $type = 2;
                      var $name = 'newValue';
                      var $value = 'carmelo';
                    },
                    4 => 
                    class domattribute {
                      var $type = 2;
                      var $name = 'key';
                      var $value = 'false';
                    },
                  );
                },
              );
            },
    Io con dom_xml so accedere a dei nodi tipo questi <dati>ciao</dati> ma non riesco a capire come ragionare per accedere a questi tipi di nodi... ho provato molte funzioni come da guida ma senza successo.
    Magari c'e' bisogno di qualche ciclo per muoversi all'interno degli array.

    Qualcuno mi da qualche dritta per arrivare a capire come muoversi ?

    Io ad esempio avevo provato cosi: (seguendo la guida del phpDay)

    codice:
    $domDoc = domxml_open_file( realpath('xml/deltapacket.xml') ) ;
    $root=$domDoc -> document_element();
    $node_update = $root -> child_nodes();
    
    foreach ($node_update as $nodo) {
    
    
    echo $nodo -> node_name();
    
    }
    Questo ad esempio mi stampa il nome del nodo figlio del nodo principale xml ovvero <update></update> il mio output sara "update update".... ma come faccio ad accedere al valore di "id" ? o provato con diverse funzioni ma non ci riesco.

    Altra domanda perche questo non mi funziona ?

    $root=$domDoc -> document_element();
    $node_update = $root -> child_nodes();
    $node_array = $node_update -> child_nodes();

    poi con lo stesso ciclo come sopra non riesco ad accedere ai nodi con le funzioni dom.


    Qualcuno mi illumina ?

    Spero di essermi spiegato bene, non era facile.
    IACO

  2. #2
    Ciao,
    quello di attraversare l'albero delgi oggetti come stai facendo è un metodo, e va bene, solo devi tenere presente che id è un attributo e non un elemento.

    Un metodo più semplice è quello di ricorrere a
    http://it.php.net/manual/en/function...ment-by-id.php

    o usare le funzioni XPATH (in generale per lavorare bene con DOM bisogna prima studiare a fondo XPATH, trovi diverse guide in rete).

    Per saperne di più su PHP e XML puoi dare un'occhiata qui e scaricare slide ed esempi
    www.phpday.it/download/
    per favore NIENTE PVT TECNICI da sconosciuti

  3. #3
    Utente di HTML.it L'avatar di iaco74
    Registrato dal
    Sep 2002
    Messaggi
    682
    ok fabio grazie per la risposta.......

    Devo ancora dare un occhiata alla funzione get_element_by_id();

    Intanto ho fatto qualche progresso seguendo sempre il pdf del phpDay.

    Sempre tenendo conto che il file che devo parsare e' questo :

    codice:
      <?xml version="1.0" ?> 
     <update_packet tableName="" nullValue="{_NULL_}" transID="IID93119464815:Sat May 29 00:13:53 GMT+0200 2004">
     <update id="IID88087640470">
      <field name="cliente" type="String" oldValue="guido" newValue="carmelo" key="false" /> 
      </update>
     <update id="IID86692974530">
      <field name="cliente" type="String" oldValue="mario" newValue="franco" key="false" /> 
      </update>
      </update_packet>
    con questo codice :

    codice:
    $domDoc = domxml_open_file( realpath('xml/deltapacket.xml') ) ;
    $root = $domDoc -> document_element();
    $update = $root -> child_nodes();
    
    
    foreach ($update as $nodo) {  
    foreach ($nodo -> child_nodes()  as $subNodo) { 
    $subName=$subNodo -> node_name();
    $content=$subNodo -> attributes();
    foreach ($content as $key=>$value) {
    
    echo $key."----".$value."
    ";
    
    
    }
    }
    }
    Sono arrivato a questo output :

    codice:
    0----Object
    1----Object
    2----Object
    3----Object
    4----Object
    0----Object
    1----Object
    2----Object
    3----Object
    4----Object
    Adesso pero' non so come accedere a questi Array di oggetti.....

    Sono fuori strada ?
    Oppure ho preso la strada piu' complicata ?
    IACO

  4. #4
    Utente di HTML.it L'avatar di iaco74
    Registrato dal
    Sep 2002
    Messaggi
    682
    Avevo preso la strada più complicata.......

    Ho dato un occhiata alle funzioni get_elements_by_tagname e get_elements_by_id ........

    Sono finalmente arrivato ad un buon risultato :

    codice:
    $domDoc = domxml_open_file( realpath('xml/deltapacket.xml') ) ;
    $root = $domDoc -> document_element();
    $tag= $root -> get_elements_by_tagname("field");
    $up_sql=array();
    for ($i = 0; $i<count($tag); $i++) {
       $node = $tag[$i];
       $campo = $node->get_attribute("name");
       $valore = $node -> get_attribute("newValue");
       $up_sql[$i]="INSERT INTO prova (nome,step3) VALUES ('".$valore."','1') WHERE tipo='".$campo."'";
       //$query=mysql_query($up_sql[i],$connessione);
       
       
    }
    Cosi facendo finalmente dovrei essere in grado (non ho provato l'aggiornamento del db ma dovrebbe fungere) di aggiornare un database da un documento xml.

    Alcune domande:

    Il discorso dell'aggiornamento del db si poteva fare meglio ?

    Su suggerimento di un utente su un altro forum ho dato un occhiata anche a questa classe. http://sourceforge.net/projects/phpdomxml

    Deve essere ancora implementata, ma come approccio si avvicina di piu' ad ActionScript javascript.

    Io ho avuto difficoltà a capire le funzioni domxml di php perchè ragionavo come se facessi il parsing con ActionScript.
    Solo adesso capisco che php ha un approccio diverso, e su questo ti volevo fare una domanda.
    Con php 5 cambieranno le funzioni e saranno piu' orientate all'approccio AS/JS ?


    Grazie ancora
    IACO

  5. #5
    Originariamente inviato da iaco74

    Il discorso dell'aggiornamento del db si poteva fare meglio ?

    >>>Mi sembra possa andre bene così...poi in massima parte dipende dalle tue esigenze

    Su suggerimento di un utente su un altro forum ho dato un occhiata anche a questa classe. http://sourceforge.net/projects/phpdomxml

    >>> Secondo me vale la pena usarla soltanto se non hai a disposizione l'estensione php_domxml, è una classe PHP quindi inevitabilmente molto più lenta


    Io ho avuto difficoltà a capire le funzioni domxml di php perchè ragionavo come se facessi il parsing con ActionScript.
    Solo adesso capisco che php ha un approccio diverso, e su questo ti volevo fare una domanda.
    Con php 5 cambieranno le funzioni e saranno piu' orientate all'approccio AS/JS ?

    >>>L'approccio Actionscript è diverso da quello javascript a quanto ne so...quello javascript molto completo, quello actionscript molto lacunoso e non certo rapido da utilizzare.
    Non so però se ad esmpio tu possa usare xpath con javascript.
    In php 5 dom_xml è il fiore all'occhiello dell'interazione PHP/XML ed è aderente agli standard, quindi ti troverai molto meglio, specialmente se imparerai xpath.


    per favore NIENTE PVT TECNICI da sconosciuti

  6. #6
    Utente di HTML.it L'avatar di iaco74
    Registrato dal
    Sep 2002
    Messaggi
    682
    ok mooolto esaudiente ......
    Capito tutto .....
    Non sapevo che usando una classe come quella si perdesse in prestazioni.
    Grazie mille fabio alla prossima
    IACO

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.