Sommaire
Analyseur syntaxique XML
Introduction
Quelques exemples
xml_parser_create
xml_set_object
xml_set_element_handler
xml_set_character_data_handler
xml_set_processing_instruction_handler
xml_set_default_handler
xml_set_unparsed_entity_decl_handler
xml_set_notation_decl_handler
xml_set_external_entity_ref_handler
xml_parse
xml_get_error_code
xml_error_string
xml_get_current_line_number
xml_get_current_column_number
xml_get_current_byte_index
xml_parse_into_struct
xml_parser_free
xml_parser_set_option
xml_parser_get_option
utf8_decode
utf8_encode
|
6.102.18 xml_parse_into_struct[ Exemples avec xml_parse_into_struct ] PHP 3>= 3.0.8, PHP 4 >= 4.0.0Description
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
)
)
|
|
|
|