(PHP 4, PHP 5)
xml_parse_into_struct — Analyse une structure XML
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 2821. 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 2822. moldb.xml - Petite base de données moléculaires
Exemple 2823. 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
) {
// lit la base de données xml des acides aminés
$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
);
// 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
);
?>
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 ) )