(PHP 4, PHP 5, PHP 7, PHP 8)
xml_parse_into_struct — Analyse une structure XML
$parser,$data,&$values,&$index = null
   Cette fonction analyse la chaîne
   XML data et le place dans deux tableaux :
   le premier index contient des pointeurs
   sur la position des valeurs correspondantes dans le tableau
   values. Ces deux paramètres sont
   passés par références.
  
parserUne référence à une analyseur XML.
dataUne chaîne de caractères contenant les données XML.
valuesUn tableau contenant les valeurs des données XML.
indexUn tableau contenant les pointeurs vers les valeurs appropriées dans le paramètre $values.
   xml_parse_into_struct() retourne 0 si une
   erreur survient et 1 en cas de succès. Ce n'est pas la même chose que false
   et true, soyez prudent avec les opérateurs comme ===.
  
| Version | Description | 
|---|---|
| 8.0.0 | parserattend une instance de XMLParser
  désormais; auparavent, une resourcexmlétait attendue. | 
   Ci-dessous, vous trouverez un exemple qui illustre la structure
   des deux tableaux générés par la fonction. On utilise une balise
   simple note, placée dans une autre balise
   para. On analyse le tout, et on
   affiche la structure générée :
   
Exemple #1 Exemple avec xml_parse_into_struct()
<?php
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);
?>Affichera :
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
        )
)
L'analyse événementielle (comme celle de expat), peut se révéler complexe lorsque le document XML est complexe. xml_parse_into_struct() ne génère pas d'objet de type DOM, mais il génère plutôt des structures qui peuvent être parcourues à la façon d'un arbre. Considérons le fichier suivant, qui représente une petite base de données XML :
Exemple #2 moldb.xml - Petite base de données moléculaires
<?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>
Exemple #3 parsemoldb.php : Analyse moldb.xml et crée un tableau d'objets moléculaires
<?php
class AminoAcid {
    var $name;  // nom aa
    var $symbol;    // symbole à trois lettres
    var $code;  // code à une lettre
    var $type;  // hydrophobique, chargé ou neutre
    function __construct ($aa) {
        foreach ($aa as $k=>$v)
            $this->$k = $aa[$k];
    }
}
function readDatabase($filename) {
    // lit la base de données xml des acides aminés 
    $data = file_get_contents($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);
    unset($parser);
    // boucle à travers les structures
    foreach ($tags as $key=>$val) {
        if ($key == "molecule") {
            $molranges = $val;
            // each contiguous pair of array entries are the 
            // lower and upper range for each molecule definition
            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 "** Base d'objets AminoAcid :\n";
print_r($db);
?>** Base d'objets AminoAcid :
Array
(
    [0] => aminoacid Object
        (
            [name] => Alanine
            [symbol] => ala
            [code] => A
            [type] => hydrophobic
        )
    [1] => aminoacid Object
        (
            [name] => Lysine
            [symbol] => lys
            [code] => K
            [type] => charged
        )
)
