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
E ora che volessimo prendere i dati che ci sono in ogni attributo.<?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>
Prima di tutto creo un parser xml e un array che dica la struttura:
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:$struttura = array();
$parser = xml_parser_create();
Ora, finalmente, gli dico al php di usare quelle due 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 posso finalmente leggere i dati dal file: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
Però, se faccio print_r($struttura); mi viene così: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
Allora, ho fatto dei foreach per fargli venire fuori 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 ) ) ) ) ) )
Attenzione, però, che se si usano i foreach che scriverò sotto, non saranno compresi gli attributi.Array ( [0] => Array ( [ID] => 1 [NOME] => Mario [COGNOME] => rossi ) [1] => Array ( [ID] => 2 [NOME] => Mario [COGNOME] => rossi ) )
Alla fine i nostri dati saranno nella variabile $dati.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;
}
}
}
}
Comunque, se qualcuno vuole, può anche fare in modo che si possano mettere gli attributi.

Rispondi quotando
