|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PHP - Parser du XMLIntroduction à XMLPHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML.
Cette séparation entre le contenu et la présentation se fait à l'aide d'un analyseur syntaxique (parseur), c'est-à-dire un programme capable de vérifier la cohérence de la syntaxe du document et de l'interpréter afin de mettre en page son contenu. PHP propose une extension permettant de mettre au point facilement des analyseurs XML. Cette extension utilise la librairie expat disponible à http://www.jclark.com/xml/. Installer l'extension XMLL'extension XML de PHP supporte la librairie expat disponible à http://www.jclark.com/xml/.
Pour vérifier que votre installation supporte bien la librairie expat, il vous suffit de créer un fichier phpinfo.php3 contenant uniquement les lignes suivantes <? phpinfo(); ?> Fonctionnement de l'extension XMLLes analyseurs XML sont également divisés selon l'approche qu'ils utilisent pour traiter le document. On distingue actuellement deux types d'approches :
Considérons le document XML suivant : <debut> Bienvenue sur CCM - http://www.commentcamarche.net </debut> Avec un parseur XML utilisant une approche événementielle, les 3 événements suivants seraient générés :
L'extension XML fonctionne selon un mode événementiel, c'est-à-dire qu'elle définit des fonctions permettant de réagir aux divers événements :
Création de l'analyseur XMLLa première étape consiste à créer un analyseur XML (ou plus exactement pour utiliser une instance de parseur XML) grâce à la
fonction xml_create_parser()
$xml_parseur = xml_parser_create();
Une fois le parseur créé, il s'agit de lui associer des événements, c'est-à-dire qu'il s'agit
de créer des fonctions qui seront appelées par le parseur en cas de déclenchement d'un événement.
Toutes ces fonctions de gestion des événements prennent comme premier argument l'instance du parseur qui a été renvoyée par la fonction xml_create_handler(). Prenons l'exemple de la fonction xml_set_element_handler(). Cette fonction nécessite trois arguments :
Par exemple la fonction chargée de gérer l'événement "balise ouvrante" doit comporter trois paramètres : function ouverture ($parser, $name, $attrs){ echo "$name<BR>"; }Son nom et le nom de ses attributs peuvent être modifiés mais le nombre de ses arguments et leur ordre doit être conforme au manuel PHP. Dans le cas de la fonction associée à l'ouverture de balise, le premier argument est l'identifiant de l'instance du parseur, le second est le nom de la balise rencontrée (pour une balise <Debut> sa valeur sera "Debut") et le troisième est un tableau associatif contenant tous les noms des attributs de cet élément et leur valeur. Voici certains gestionnaires d'événement que nous allons définir
La fonction xml_parser_set_option() permet de définir des options de parsage. Le premier argument est bien évidemment l'instance du parseur. Le second argument peut prendre deux valeurs (0 ou 1, représenté par la constante XML_OPTION_CASE_FOLDING) : cette option est activée par défaut. Le fait de désactiver cette option force le gestionnaire d'événement à transformer les noms des balises en majuscule (il est essentiel de ne pas la désactiver car le XML est sensible à la casse, c'est-à-dire qu'il différencie minuscules et majuscules). Le troisième argument définit quel encodage utiliser dans le parseur XML (ISO-8859-1, US-ASCII ou UTF-8). Par défaut l'encodage est celui de xml_parser_create()) xml_parser_set_option($xml_parseur, XML_OPTION_CASE_FOLDING); Pour parser un fichier XML, il suffit de l'ouvrir en lecture, puis de faire appel à la fonction xml_parse() : $fp = fopen("essai.xml", "r") or die(" Si le document XML n'est pas bien formé la fonction xml_parse() renvoie la valeur false
Appel à des entités externesComme chacun devrait le savoir, il est possible avec XML de faire appel à des entités
externes, c'est-à-dire importer des éléments XML stockés dans un autre fichier.
Ainsi il est essentiel lors du parsage d'un fichier XML d'incorporer le document externe au document XML principal.
<!ENTITY systemEntity SYSTEM "externe.xml"> <? // Fichier à analyser $file = "data.xml"; // variable de la profondeur du parcours de l'arbre $depth = array(); // Etat de la pile de parcours du document XML $stack = array(); // Valeur d'un dernier élément lu $globaldata =""; // Fonction associée à l’événement début d’élément function startElement($parser, $name, $attrs) { global $depth; global $stack; for ($i = 0; $i < $depth[$parser]; $i++) {print " ";} array_push($stack,$name); $depth[$parser]++; print "Début de l'élément : ".$name."\n -- "; print "profondeur : ".$depth[$parser]." -- Attributs de l'élément : "; //affichage des attributs de l'élément while (list ($key, $val) = each ($attrs)) {echo "$key => $val";} print " "; } // Fonction associée à l’événement fin d’élément function endElement($parser, $name) { global $depth; global $stack; global $globaldata; for ($i = 0; $i < $depth[$parser]-1; $i++) {print " ";} print "Fin de l'élément : ".$name." avec la valeur :".$globaldata." -- "; print "profondeur : ".$depth[$parser]." "; $depth[$parser]--; array_pop($stack); } // Fonction associée à l’événement données textuelles function characterData($parser, $data) { global $globaldata; $globaldata = $data; } // Fonction associée à l’événement de détection d'un appel d'entité externe function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Impossible d'ouvrir %s à %s\n", $openEntityNames, $systemId); return FALSE; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("Erreur XML : %s à la ligne %d lors du traitement de l'entité %s\n", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); xml_parser_free($parser); return FALSE; } } xml_parser_free($parser); return TRUE; } return FALSE; } // Fonction de création du parser et d'affectation // des fonctions aux gestionnaires d'événements function new_xml_parser($file) { global $parser_file; //création du parseur $xml_parser = xml_parser_create(); //Activation du respect de la casse du nom des éléments XML xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); //Déclaration des fonctions à rattacher au gestionnaire d'événement xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); //Ouverture du fichier if (!($fp = @fopen($file, "r"))) { return FALSE; } //Transformation du parseur en un tableau if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $file; return array($xml_parser, $fp); } // Appel à la fonction de création et d'initialisation du parseur if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("Impossible d'ouvrir le document XML"); } // Traitement de la ressource XML while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("Erreur XML : %s à la ligne %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } // Libération de la ressource associée au parser xml_parser_free($xml_parser); ?> Article écrit par Jean-François Pillou Trucs & astuces pertinents trouvés dans la base de connaissances
Discussions pertinentes trouvées dans le forum
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||