Visualizzazione dei risultati da 1 a 5 su 5

Discussione: prelevare dati con xml

  1. #1

    prelevare dati da xml

    Vi è mai capitato di voler prendere dati da xml?
    Qui vi descrivo un metodo per prendere dati da xml usando il metodo sax, Simple Api for Xml.
    Mettiamo di avere un file xml messo in questo modo:
    esempio.xml
    <?xml version="1.0"?>
    <utenti>
    <persona>
    <id>1</id>
    <nome>Mario</nome>
    <cognome>rossi</cognome>
    </persona>
    <persona>
    <id>2</id>
    <nome>Mario</nome>
    <cognome>rossi</cognome>
    </persona>
    </utenti>
    E ora che volessimo prendere i dati che ci sono in ogni attributo.
    Prima di tutto creo un parser xml e un array che dica la struttura:
    Codice PHP:
     $struttura = array(); 
     
    $parser xml_parser_create(); 
    Ora, visto che le funzioni xml di php, che usano sax, hanno bisogno di una funzione che dica quando inizia un tag e quando finisce e anche una funzione per leggere il testo, creo tre funzioni.
    Codice PHP:
          function startElement($parser$name$attrs// Funzione per iniziare
          
    {
            global 
    $stuttura// Globalizzo l'array della struttura
            
    $tag = array("name"=>$name,"attrs"=>$attrs); //Metto che il nome del tag e i suoi attributi siano un array (tag)
            
    array_push($struttura,$tag); //Inserisco l'array tag nell'array struttura
          
    }
          function 
    data($parser$data//Per leggere il testo
          

            global 
    $struttura,$i
            if(
    trim($data)) { 

              
    $struttura[count($struttura)-1]['data']=$data// Nell'array struttura, metto i dati letti
          
    }
          } 
          function 
    endElement($parser$name// Per chiudere i tag
          

            global 
    $struct
            
    $struttura[count($struttura)-2]['child'][] = $struttura[count($struct)-1];
            
    array_pop($struttura);
          } 
    Ora, finalmente, gli dico al php di usare quelle due funzioni:
    Codice PHP:
          xml_set_element_handler($xml_parser"startElement""endElement"); //Per l'inizio e la fine dei dati
          
    xml_set_character_data_handler($xml_parser"data"); //Per i dati 
    Ora posso finalmente leggere i dati dal file:
    Codice PHP:
          $file "esempio.xml"//Gli dico il file 
          
    $parse xml_parse($xml_parser,file_get_contents($file)); //Faccio andare il parse
          
    if(!$parse) die("XML parsing error"); //Se c'è un errore
          
    xml_parser_free($xml_parser); //Libero il puntatore 
    Però, se faccio print_r($struttura); mi viene così:

    Array ( [0] => Array ( [name] => UTENTI [attrs] => Array ( ) [child] => Array ( [0] => Array ( [name] => PERSONA [attrs] => Array ( ) [child] => Array ( [0] => Array ( [name] => ID [attrs] => Array ( ) [data] => 1 ) [1] => Array ( [name] => NOME [attrs] => Array ( ) [data] => Mario ) [2] => Array ( [name] => COGNOME [attrs] => Array ( ) [data] => rossi ) ) ) [1] => Array ( [name] => PERSONA [attrs] => Array ( ) [child] => Array ( [0] => Array ( [name] => ID [attrs] => Array ( ) [data] => 2 ) [1] => Array ( [name] => NOME [attrs] => Array ( ) [data] => Mario ) [2] => Array ( [name] => COGNOME [attrs] => Array ( ) [data] => rossi ) ) ) ) ) )
    Allora, ho fatto dei foreach per fargli venire fuori così:
    Array ( [0] => Array ( [ID] => 1 [NOME] => Mario [COGNOME] => rossi ) [1] => Array ( [ID] => 2 [NOME] => Mario [COGNOME] => rossi ) )
    Attenzione, però, che se si usano i foreach che scriverò sotto, non saranno compresi gli attributi.
    Codice PHP:
    foreach($struttura as $value)
    {
     foreach (
    $value as $value2)
     {
      if(
    is_array($value2))
      {
       foreach (
    $value2 as $value3)
       {  
        foreach (
    $value3 as $value4)
        {
         if(
    is_array($value4))
         {
          foreach(
    $value4 as $value5)
          {
           if(
    is_array($value5))
           {
            foreach(
    $value5 as $key=>$value6)
            {
             if(
    $key=="name"$n=$value6;
             if(
    $key=="data"$contenuto[$n]=$value6;
            }
           }
          }
         }
        }
        
    $dati[]=$contenuto;
       }
      }
     }

    Alla fine i nostri dati saranno nella variabile $dati.
    Comunque, se qualcuno vuole, può anche fare in modo che si possano mettere gli attributi.

  2. #2

  3. #3
    A me la cosa interesserebbe.
    Ho un file xml generato da un gioco che salva un report dei dati della gara che si è disputata.
    Quindi devo leggere questi dati, ed inserirli in mysql, per poi farci delle statistiche ecc.

    Ora sono arrivato a leggere tutto il file xml, e quindi salvarlo all'interno di un array.
    A questo punto devo ciclare sull'array ed estrarre tutti i dati che mi servono.

    qui trovate un esempio del file xml che devo intepretare

    http://www.apocalypse-team.net/files...18_41-82SR.zip

    se avete un'idea di come fare ve ne sarei grato.

    saluti, Luca

  4. #4
    Intanto mi sono accorto che mi ero dimenticato di dire che ho preso lo script da http://www.siforge.org/articles/2005/06/28-php-sax.html e poi il foreach va bene in quel caso solo...
    Per fare quello che ti interessa, c'è una struttura ben definita?

  5. #5
    più o meno la struttura è sempre la stessa che vedi nel file xml che ho postato.

    Son riuscito a fare un lavoro del genere scandendo nodo per nodo tutto l'array e riconoscendo dei gruppi di dati che ho quindi salvato in array parziali con il rispettivo argomento e valore.

    poi da li ho preso i singoli array e li ho inseriti all'interno del db.

    Sembra che funzioni. Poi quando ho finito tutto il progetto ti mostro cosa stiamo realizzando.

    grazie.

    ciauzzz, Luca

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.