6.Le langage PHP
6.17.Parser un document XML
6.17.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.
Il existe en fait 2 façons différentes de procéder:
- Via un parseur dit de type "SAX parser", dont le principe consiste à parcourir le flux XML (du début vers la fin) et de "s'arrêter" dès qu'un élément particulier est rencontré afin de le traiter.
- Via la représentation DOM du flux, dont le principe consiste à charger tout le flux XML sous la forme d'un arbre (en mémoire) puis d'aller y piocher l'information qui nous interesse.
|
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.17.2.Parseur de type "SAX parser"
6.17.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
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>ToutEstFacile - Exemple de flux RSS</title>
<link>http://www.toutestfacile.com/</link>
<description>Exemple de traitement de flux XML en PHP</description>
<language>fr</language>
<item>
<title>Les cours PHP</title>
<author>toutestfacile.com</author>
<pubDate>Sun, 04 Feb 2007 18:20:00 +1000</pubDate>
<link>http://www.phpfacile.com/</link>
<description>Apprendre PHP facilement</description>
</item>
<item>
<title>Les cours SQL</title>
<author>toutestfacile.com</author>
<pubDate>Sun, 04 Feb 2007 18:20:00 +1000</pubDate>
<link>http://www.sqlfacile.com/</link>
<description>Apprendre SQL facilement</description>
</item>
<item>
<title>Les cours XML</title>
<author>toutestfacile.com</author>
<pubDate>Sun, 04 Feb 2007 18:20:00 +1000</pubDate>
<link>http://www.xmlfacile.com/</link>
<description>Apprendre XML facilement</description>
</item>
</channel>
</rss>
6.17.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
ToutEstFacile - Exemple de flux RSS
http://www.toutestfacile.com/
Exemple de traitement de flux XML en PHP
fr
Les cours PHP
toutestfacile.com
Sun, 04 Feb 2007 18:20:00 +1000
http://www.phpfacile.com/
Apprendre PHP facilement
Les cours SQL
toutestfacile.com
Sun, 04 Feb 2007 18:20:00 +1000
http://www.sqlfacile.com/
Apprendre SQL facilement
Les cours XML
toutestfacile.com
Sun, 04 Feb 2007 18:20:00 +1000
http://www.xmlfacile.com/
Apprendre XML facilement
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.