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.