6.107 Analyseur syntaxique XML
6 Index des fonctions
Manuel PHP
. Introduction . Pré-requis . Installation . Configuration à l'exécution . Types de ressources . Constantes Prédefinies . gestionnaires d'évènements . Problèmes de casse . Codes d'erreurs . Codage des caractères . Exemples . utf8_decode . utf8_encode . xml_error_string . xml_get_current_byte_index . xml_get_current_column_number . xml_get_current_line_number . xml_get_error_code ->xml_parse_into_struct . xml_parse . xml_parser_create_ns . xml_parser_create . xml_parser_free . xml_parser_get_option . xml_parser_set_option . xml_set_character_data_handler . xml_set_default_handler . xml_set_element_handler . xml_set_end_namespace_decl_handler . xml_set_external_entity_ref_handler . xml_set_notation_decl_handler . xml_set_object . xml_set_processing_instruction_handler . xml_set_start_namespace_decl_handler . xml_set_unparsed_entity_decl_handler
|
6.107.19 xml_parse_into_struct()Analyse une structure XML[ Exemples avec xml_parse_into_struct ] PHP 3>= 3.0.8, PHP 4
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
array. Ces deux paramètres sont
passés par références.
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 :
<?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); ?>
|
Lors de l'éxécution du code, l'affichage sera :
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 :
| moldb.xml - Petite base de données moléculaire |
<?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 maitenant, un code qui analyse le document, et génère les
objet ad hoc :
| parsemoldb.php - analyse moldb.xml et crée un tableau d'objet moléculaires |
<?php class AminoAcid { var $name; // nom de l'amino acide var $symbol; // symbole en trois lettres var $code; // code en une lettre var $type; // hydrophobe, 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); // parcourt les structures foreach ($tags as $key->$val) { if ($key == "molecule") { $molranges = $val; // chaque paire contigue sont les définitions supérieures // et inférieures de la molécule 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 of AminoAcid objects:\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 :
** Database of AminoAcid objects:
Array
(
[0] => aminoacid Object
(
[name] => Alanine
[symbol] => ala
[code] => A
[type] => hydrophobic
)
[1] => aminoacid Object
(
[name] => Lysine
[symbol] => lys
[code] => K
[type] => charged
)
)
|
|