6.Le langage PHP
6.18.Parser un document XML
6.18.1.Introduction
Vous avez probablement déjà entendu parler d'XML
[c'est quoi?]
vous devez donc savoir qu'il ne s'agit pas d'un langage ou d'une norme destinée à remplacer l'HTML mais qu'il s'agit d'un standard minimum pour décrire des données destinées à être échangées.
Vous serez donc peut-être amenés, un jour où l'autre, à devoir intégrer dans vos pages HTML ou dans vos bases des données issues de documents XML. L'objet de ce cours est donc de vous permettre d'effectuer ce travail.
A titre d'exemple, nous nous appuyerons sur des documents XML à la mode, les fichiers RSS
[c'est quoi?]
dont nous avons créé un exemple à l'adresse http://www.phpfacile.com/exemples_live/fluxrss.rss.
Il existe en fait 2 façons différentes de procéder:
Nous commencerons par présenter la façon "SAX parser" (qui n'est pas la méthode la plus pratique à mettre en oeuvre mais celle la plus simple à comprendre puisqu'elle ne nécessite pas une connaissance approfondie d'XML et de ce qui gravite autour). La méthode DOM est présentée plus loin [ici]
|
6.18.2.Parseur de type "SAX parser"
6.18.2.1.Principe du "parseur" XML
Avec la technique présentée ici, on demande au parseur de parcourir un document ligne par ligne et ce dernier "s'arrête" lorsqu'il rencontre une balise "ouvrante" (entre < et >), lorsqu'il rencontre une balise "fermante" (entre </ et >) ou lorsqu'il rencontre du texte entre deux balises. Lorsqu'il rencontre l'un de ces cas de figure, le "parseur" appelle la fonction correspondante (que vous aurez définie) afin d'effectuer le traitement nécessaire (généralement traduction en code HTML).
La première étape consiste donc à lire le document ligne par ligne comme le permet le script suivant:
|
<?php
$fichier = "http://www.phpfacile.com/exemples_live/fluxrss.rss"; // Ouverture du fichier $fp = fopen($fichier, "r"); if (!$fp) die("Impossible d'ouvrir le fichier XML"); // Lecture ligne par ligne while ( $ligneXML = fgets($fp, 1024)) { // Affichage "brut" de la ligne convertie en HTML echo htmlEntities($ligneXML)."<br />"; } fclose($fp); ?> |
Ce qui donne
|
6.18.2.2.Mise en place avec xml_parser_create() et xml_parse()
Dans un premier temps, il faut donc créer le "parseur"; pour cela vous disposez de la fonction xml_parser_create() qui retourne simplement un identifiant qui servira pour les appels des autres fonctions. A la fin du script, les ressources allouées par ce "parseur" devront être restituées par un appel à xml_parser_free().
Lorsque le "parseur" rencontrera du texte (compris entre deux balise), celui-ci appelera une fonction que vous aurez créée et lui passera deux paramètres: l'identifiant du "parseur" et le texte qu'il a rencontré. Mais pour arriver à ce résultat, il faudra bien évidemment, au préalable, lui indiquer le nom de la fonction à appeler. Pour cela, vous ferez appel à la fonction xml_set_character_data_handler(). Cette fonction réclame deux paramètres: l'identifiant du "parseur" et le nom de la fonction chargée de traiter le texte.
Pour passer à l'analyse proprement dite du fichier, vous ferez appel (ligne après ligne) à la fonction xml_parse() avec trois paramètres: l'identifiant du "parseur", la ligne à "parser" et un booléen (TRUE ou FALSE) indiquant s'il s'agit de la dernière ligne du fichier ou non.
|
<?php
$fichier = "http://www.phpfacile.com/exemples_live/fluxrss.rss"; // Ma propre fonction de traitement du texte // qui est appelée par le "parseur" function fonctionTexte($parseur, $texte) { // Dans l'immédiat nous nous contentons d'afficher // le texte brut accompagné d'un simple retour à la ligne echo $texte."<br/>"; } // Création du parseur XML $parseurXML = xml_parser_create(); // Je précise le nom de la fonction a appeler // lorsque du texte est rencontré xml_set_character_data_handler($parseurXML, "fonctionTexte"); // Ouverture du fichier $fp = fopen($fichier, "r"); if (!$fp) die("Impossible d'ouvrir le fichier XML"); // Lecture ligne par ligne while ( $ligneXML = fgets($fp, 1024)) { // Analyse de la ligne // REM: feof($fp) retourne TRUE s'il s'agit de la dernière // ligne du fichier. xml_parse($parseurXML, $ligneXML, feof($fp)) or die("Erreur XML"); } xml_parser_free($parseurXML); fclose($fp); ?> |
Ce qui donne
|
Comme vous le constatez, l'opération est réussie, nous affichons bien le texte mais... ce n'est pas génial pour autant, puisque finalement, nous, ce qui nous interesse c'est uniquement le texte des balises <title> des blocs <item> et le texte des balises <link> nous aimerions le récupérer non pas pour l'afficher mais pour le proposer sous forme de liens hypertextes. C'est donc l'objectif des chapitres suivants.



xml_01.php
