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.

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
        )

)