(PHP 4, PHP 5, PHP 7, PHP 8)
xml_parse_into_struct — Analizza i dati XML in una struttura array
   Questa funzione analizza una stringa XML in 2 strutture array parallele,
   una (index) contiene i puntatori alla posizione dei
   valori opportuni nell'array values. Quest'ultimi
   due parametri devono essere passati per riferimento.
  
parserUn riferimento al parser XML.
dataUna stringa contenente i dati XML.
valuesUna array contenente i valori dei dati XML
indexUn array contenente i puntatori alla posizione degli opportuni valori in $values.
   xml_parse_into_struct() restituisce 0 per fallimento e 1 per
   successo. Questo non è lo stesso di false e true, fare attenzione con
   gli operatori come ===.
  
   Nell'esempio seguente si illustra la struttura interna degli
   array generati da questa funzione. Utilizziamo un semplice
   tag note incorporato all'interno di un
   tag para, e quindi lo si analizzerà e stamperemo
   le strutture generate:
   
Example #1 Esempio di uso 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 "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);
?>Eseguendo questo codice si avrà come output:
Index array
Array
(
    [PARA] => Array
        (
            [0] => 0
            [1] => 2
        )
    [NOTE] => Array
        (
            [0] => 1
        )
)
Vals array
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 possono 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 in un array di oggetti molecolari
<?php
class AminoAcid {
    var $name;  // nome aa
    var $symbol;    // simbolo di tre lettere
    var $code;  // codice di una lettera
    var $type;  // idrofobo, carico o neutro
    
    function AminoAcid ($aa) 
    {
        foreach ($aa as $k=>$v)
            $this->$k = $aa[$k];
    }
}
function readDatabase($filename) 
{
    // legge il database XML di amminoacidi
    $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);
    // cicla attraverso le strutture
    foreach ($tags as $key=>$val) {
        if ($key == "molecule") {
            $molranges = $val;
            // ciascuna coppia di elementi contigua dell'array è
            // l'intervallo inferiore o 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 degli 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
        )
)
