(PHP 3 >= 3.0.8, PHP 4, PHP 5)
xml_parse_into_struct -- Analyse une structure XML
Description
int
xml_parse_into_struct ( resource parser, string data, array &values [, array &index] )
xml_parse_into_struct() analyse le fichier
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.
Note :
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 ===.
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); xml_parser_free($p); echo "Tableau d'index \n"; print_r($index); echo "\nTableau de valeurs \n"; print_r($vals); ?>
|
L'exemple ci-dessus va afficher : Tableau d'index
Array
(
[PARA] => Array
(
[0] => 0
[1] => 2
)
[NOTE] => Array
(
[0] => 1
)
)
Tableau de valeurs
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> |
|
Et maintenant, un code qui analyse le document, et génère les
objets ad hoc :
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 AminoAcid ($aa) { foreach ($aa as $k=>$v) $this->$k = $aa[$k]; } }
function readDatabase($filename) { // read the xml database of aminoacids $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 through the 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);
?>
|
Après exécution de parsemoldb.php, la variable
$db contient un tableau d'objets
AminoAcid, et l'affichage le confirme :
** 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
)
) |
|