Utiliser l’API SimplePie
Il y a quatre ans de cela, Olivier Duffez de WebRankInfo avait écrit un excellent article sur l’intégration de flux RSS avec l’outil MagpieRSS.
Cet outil, fort pratique, permet à un webmaster d’intégrer sur son site des fils de news RSS en provenance de diverses sources, à la manière du célèbre Netvibes. Malheureusement, le projet Magpie ayant été abandonné, le format RSS 2.0 n’est pas totalement supporté, notamment par exemple les enclosures. Heureusement, depuis quelques années, un remplaçant pointe le bout de son bec, il s’agit de SimplePie, tout aussi pratique, et simple d’utilisation, mais en plus compatible avec tout les formats RSS. C’est de lui que nous allons parler.
Tout ce que fait Magpie, SimplePie le fait également, aussi vous pouvez lire l’article d’Olivier pour plus d’informations.
Pour utiliser SimplePie, il vous faut la télécharger. Vous la trouverez sur le site http://simplepie.org. C’est le fichier simplepie.inc sous licence LGPL.
Les fonctionnalités offertes par cette API sont multiples, on a bien sûr entre autres, la gestion d’un cache, mais aussi la possibilité de filtrer le flux en y supprimant certaines publicités, ou des balises et attributs potentiellements dangeureux. Certaines configurations doivent se faire dans le fichier lui même (si vous souhaitez par exemple filtrer une balise supplémentaire), mais la pluparts peuvent se faire directement dans votre code php. En parlant de code, voici un exemple d’intégration :
// adresse du flux qu'on souhaite intégrer. $fichier_xml='http://www.lemonde.fr/rss/sequence/0,2-3208,1-0,0.xml'; // appel de la libraire SimplePie. require 'simplepie.inc'; // création d'une nouvelle instance de la classe SimplePie. $feed = new SimplePie(); // on lui indique quel fichier il doit traiter. $feed->set_feed_url($fichier_xml); // on peut lui interdire de trier par date. true par défaut. $feed->enable_order_by_date(false); // on lui indique le nom du fichier de cache. $feed->set_cache_location('cachenews/'); // on lache la pie. $feed->init(); // Si le flux contient à manger. if($feed->data){ // On défini le nombre d'articles qui nous intéressent. $max=$feed->get_item_quantity(5); // Nous voici au coeur du code d'intégration. for($x=0; $x<$max; $x++) { // On prend le x-iéme item. $item=$feed->get_item($x); // Un peu d'habillage html. echo "<div style=\"width: 290px; text-align: left; padding: 4px; background-color: #FFFFEE; border: 1px solid #CCCCCC; margin: 6px;\"> <a href=\""; // le lien ou pointe le flux. echo $item->get_permalink(); echo "\">"; // le titre du flux. echo utf8_decode($item->get_title()); echo "</a><br />"; // si enclosure, on affiche. C'est le cas du monde. if($enclosure=$item->get_enclosure(0)){ echo "<img src=\""; echo $enclosure->get_link(); echo "\" border=\"1\" style=\"float: left; margin: 4px; margin-top: 8px;\">"; } // Et la description pour finir. echo utf8_decode($item->get_description()); echo "</div>"; } }
Voila, c’est on ne peut plus simple. Pas vraiment de commentaire à rajouter sur le code en lui même, si ce n’est ici l’utilisation de utf8_decode pour afficher le texte correctement (fonction de l’encodage de votre page). Comme Olivier, je vous conseille de mettre ce code dans une fonction dédié, la seule variable étant le fichier à parser. A noter que le code suppose ici que votre enclosure soit une image, ce qui ne sera pas souvent le cas en général.
Parser un fichier XML avec l’API DOM
Ce petit article n’a pas pour objectif de vous enseigner XML, ni ne prétend être un cours exhaustif au sujet de l’API DOM. Il vous expliquera seulement, comment, à partir d’un fichier XML, extraire les données qu’il contient, et les afficher dans une page web. Nous utiliserons pour cela le langage PHP5.
Pour parser un fichier XML, il existe de nombreuses méthodes. Vous pouvez utiliser les fonctions standards de traitements de fichiers, et chaines de caractères, alliées aux très puissantes expressions régulières, ou si vous souhaitez perdre moins de temps utiliser SimpleXML beaucoup plus adapté. Il existe un troisième chemin, pas toujours plus efficace, ni même plus simple, mais qui offre l’avantage d’être un standard du W3C accessible depuis la plupart des langages. Vous l’avez bien compris, nous allons utiliser le Document Object Model, déjà survolé quelquefois en Javascript sans toujours oser le nommer.
Nous allons donc supposer que vous ayez un fichier XML à parser. Nous ne nous poserons pas de questions sur la validé de ce fichier avec la DTD qui lui est associé. Vous ne savez pas ce qu’est une DTD ? Tant mieux, cela ne vous servirait à rien ici. Tout ce que nous voulons c’est extraire des données du fichier. Imaginons que notre fichier contienne les données qui suivent :
<catalogue>
<ordinateurs>
<marque prix="1200">Sony</marque>
<marque prix="1800">Fujitsu</marque>
<marque prix="1300">IBM</marque>
</ordinateurs>
<imprimantes>
<marque prix="300">Epson</marque>
</imprimantes>
</catalogue>
Récupérer le contenu d’une balise
Par récupérer le contenu d’une balise, nous entendons le texte se trouvant entre la balise ouvrante, et celle fermante, ainsi, Sony, Fujitsu, IBM, et Epson sont des contenus de balise. Supposons que nous voulions afficher la liste des marques d’ordinateurs, voici le code que nous devrions utiliser :
<?php
$dom =new DomDocument();
$dom->load('monfichier.xml');
$ordinateurs=$dom->getElementsByTagName('ordinateurs')->Item(0);
$marques = $ordinateurs-> getElementsByTagName('marque');
foreach($marques as $marque)
$listemarques[] = $marque->firstChild->nodeValue
?>
Le fonctionnement de ce code est assez simple. On crée un nouvel objet DOM, on charge le fichier XML contenant les données à parser. getElementsByTagName nous permet d’identifier les éléments possédant le TagName “ordinateur”, Item(0) pointe vers le premier d’entre eux. A partir de la, il ne nous reste plus qu’à identifier les éléments possédant le TagName “marque” parmi ceux ayant le TagName “ordinateur”. Un foreach dans la structure résultante nous permet alors de tous les afficher.
Récupérer le contenu d’un attribut
Nous entendons par attribut le texte se trouvant entre les guillemets de notre exemple XML. Nous allons donc ici récupérer les prix. Pour cela, le code utilisé sera tout aussi simple, à celui précédement vu, on rajoute tout simplement ceci :
if ($marque->hasAttribute('prix'))
{
$listeprix[] = $marque->getAttribute('prix');
}
hasAttribute, nous permet de vérifier l’existence de l’attribut prix pour la marque correspondante, et getAttribute en récupére la valeur. Bien sûr, $listemarques et $listeprix sont des tableaux. Il existe un grand nombre d’autres fonctions dans l’api DOM, aussi je vous renvois vers le manuel php, mais vous en savez déjà suffisament pour extraire les données que vous souhaiteriez d’un fichier XML.