(PHP 3>= 3.0.8, PHP 4 , PHP 5)
xml_parse_into_struct -- Analisi di dati XML in una struttura a matrice
Descrizione
int
xml_parse_into_struct ( resource parser, string data, array &valori [, array &indice] )
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.
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:
Esempio 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.
Esempio 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> |
|
Un codice per analizzare il documento e generare gli oggetti
appropriati:
Esempio 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);
?>
|
|
Dopo l'esecuzione di
parsemoldb.php, la variabile
$db contiene una matrice di oggetti
AminoAcid, e ciò viene confermato
dall'output dello script: