Manuale PHP
Indietro |  | Avanti

# xml_parse_into_struct

(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.

> 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:

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:

    ** 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
            )

    )

Indietro | Partenza | Avanti
xml_get_error_code | Risali | xml_parse