(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
)
)