xml_parse_into_struct
(PHP 4, PHP 5)
xml_parse_into_struct — Analisi di dati XML in una struttura a matrice
Descrizione
Questa funzione registra un file XML in 2 strutture a matrice, una (indice ) contiene i puntatori alla posizione dei valori nella matrice valori . Questi due parametri devono essere passati per riferimento.
Nota: La funzione xml_parse_into_struct() restituisce 0 in caso di errore e 1 in caso di successo. Questo non è lo stesso di FALSE e TRUE, fare attenzione con gli operatori tipo ===.
Nell'esempio seguente si illustra la struttura interna delle matrici generata dalla funzione. Qui si userà una semplice struttura con il tag note inserito all'interno del tag para, e quindi si analizzerà questo visualizzando la struttura ottenuta:
Example#1 Esempio di uso di xml_parse_into_struct()
<?php
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Array indice\n";
print_r($index);
echo "\narray dei valori\n";
print_r($vals);
?>
Eseguendo questo codice si otterrà :
Array indice Array ( [PARA] => Array ( [0] => 0 [1] => 2 ) [NOTE] => Array ( [0] => 1 ) ) Array dei valori Array ( [0] => Array ( [tag] => PARA [type] => open [level] => 1 ) [1] => Array ( [tag] => NOTE [type] => complete [level] => 2 [value] => simple note ) [2] => Array ( [tag] => PARA [type] => close [level] => 1 ) )
Un parsing event-driven (basato sulla libreria expat) può essere molto complicato se si deve trattare un documento XML complesso. Questa funzione non produce un oggetto in stile DOM, ma genera una struttura che permette di essere gestita a modo di albero. Quindi si può facilmente creare oggetti rappresentanti i dati del file XML. Si consideri il seguente file XML rappresentante un piccolo database di informazioni sugli aminoacidi.
Example#2 moldb.xml - piccolo database di informazioni sulle molecole
<?xml version="1.0"?> <moldb> <molecule> <name>Alanine</name> <symbol>ala</symbol> <code>A</code> <type>hydrophobic</type> </molecule> <molecule> <name>Lysine</name> <symbol>lys</symbol> <code>K</code> <type>charged</type> </molecule> </moldb>
Example#3 parsemoldb.php - analizza moldb.xml e genera una matrice di oggetti molecole
<?php
class AminoAcid {
var $name; // aa nome
var $symbol; // simbolo di tre lettere
var $code; // codice di una lettera
var $type; // hydrophobic, charged or neutral
function AminoAcid ($aa)
{
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename)
{
// legge il database degli aminoacidi
$data = implode("", file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);
// loop attraverso la struttura
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// ciascuna coppia di elementi della matrice contigui
// sono il limite inferiore e superiore per la definizione di ciascuna molecola
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}
function parseMol($mvalues) {
for ($i=0; $i < count($mvalues); $i++)
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return new AminoAcid($mol);
}
$db = readDatabase("moldb.xml");
echo "** Database di oggetti Aminoacidi:\n";
print_r($db);
?>
** Database di oggetti Aminoacidi: Array ( [0] => aminoacid Object ( [name] => Alanine [symbol] => ala [code] => A [type] => hydrophobic ) [1] => aminoacid Object ( [name] => Lysine [symbol] => lys [code] => K [type] => charged ) )