RSS2

Lire un flux RSS avec SimpleXML

Après le tuto précédent qui consistait à , je vous propose maintenant de vous initier avec simpleXML pour afficher le contenu d’un flux RSS. Comme son nom l’indique il s’agit d’une méthode très simple pour « parser » n’importe quel fichier XML.

 

L’idée de ce tutorial est de reprendre un flux RSS sur Internet et de l’afficher sur votre site Web. Ce tutorial explique donc les bases fondamentales pour parser un flux RSS. Au passage, on utilise le terme « parser » pour désigner le fait de naviguer dans un fichier XML (comme par exemple un fichier xHTML ou ici RSS) et de pouvoir retirer les informations qui nous intéressent. SimpleXML est en fait une API disponnible depuis PHP5 qui va nous permettre de manipuler un fichier XML très facilement: Son efficacité réside dans le fait qu’elle transforme un fichier XML en un objet.

Etape 1 : Activer SimpleXML?

SimpleXML est activé par défaut, cependant pour vérifier qu’il existe bien, regardez votre config PHP en éxécutant phpinfo(); dans un fichier.

simpleXMl est activé sur ma config php

Si vous ne trouvez pas la librairie c’est que vous êtes sur une version dépassée de PHP (<4). Après c'est à voir au cas par cas. Si vous travaillez sur un serveur mutualisé, il y a quelques astuces pour passer à PHP5 (chez 1and1, il y'a par exemple une petite manip à faire dans le fichier .htaccess.

Etape 2 : Charger votre flux

	try{
		if(!@$fluxrss=simplexml_load_file('http://www.lemonde.fr/rss/sequence/0,2-651865,1-0,0.xml')){
			throw new Exception('Flux introuvable');
		}
                //code à venir
	}
	catch(Exception $e){
		echo $e->getMessage();
	}

Pour ce script, nous allons gérer les erreurs avec la classe Exception qui est une classe native de PHP. je vais tout encapsuler dans un try qui est peut être vu, comme une zone sensible, et afficher les erreurs dans le catch, qui ici affichera le message d’erreur.
Nous utilisons donc la fonction simplexml_load_file qui permet de charger un fichier XML à partir d’un fichier se trouvant sur Internet, cette fonction retourne faux si le fichier ne se charge pas correctement. Ainsi avec un ‘!’ dans ma condition je teste si le fichier n’a pas été trouvé, auquel cas je « jette » une Exception (throw new Exception) qui arrête mon script en me renvoyant directement au bloc catch.

J’utilise un ‘@‘ devant la fonction simplexml_load_file, en effet le fait d’utiliser cette petite astuce permet de ne pas afficher les Warning si le fichier est introuvable.

Etape 3: Récupérer des informations avec SimpleXML

Récupérer une donnée dans un notre fichier XML va être maintenant une tache assez facile: il suffit de spécifier de l’utiliser un peu comme un tableau. $fluxrss->channel->title renverra le contenu de la balise title, ayant pour élément parent « channel » ayant lui même pour parent $fluxrss qui n’est autre que l’élement racine « rss« . Si vous êtes curieux et souhaitez connaitre le contenu de l’objet $fluxrss, affichez le avec ceci var_dump($fluxrss); .

	try{
		if(!@$fluxrss=simplexml_load_file('http://www.lemonde.fr/rss/sequence/0,2-651865,1-0,0.xml')){
			throw new Exception('Flux introuvable');
		}
		if(empty($fluxrss->channel->title) || empty($fluxrss->channel->description) || empty($fluxrss->channel->item->title))
			throw new Exception('Flux invalide');

		echo '<h3>'.$fluxrss->channel->title.'</h3>
		<p>'.$fluxrss->channel->description.'</p>';

	}
	catch(Exception $e){
		echo $e->getMessage();
	}

Il est nécessaire de faire une vérification sur le contenu du flux RSS, afin d’être sûr qu’il s’agisse d’un flux RSS bien formé. Pour cela on utilise la fonction empty sur quelques élements de notre flux. Si l’on s’apercoit que l’une des données est vide on envoit une erreur. Vous pouvez noter (string) qui permet de spécifier à PHP le type de contenu que l’on affiche, ici une chaîne de caractères.

Etape 4: Lister les Items

Pas de grandes nouveautés dans cette étape, si ce n’est l’utilisation d’une boucle foreach…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    		<title>Afficher un flux RSS</title>
		<meta name="description" content="Descriptions..." />
		<meta name="Keywords" content="Mots, clefs" />
		<link rel="stylesheet" href="/static/css/miseenpage.css" type="text/css" media="screen, projection" />
		<link rel="shortcut icon" href="favicon.ico"/>
	</head>
  	<body>
	<?php
	try{
		if(!@$fluxrss=simplexml_load_file('http://www.lemonde.fr/rss/sequence/0,2-651865,1-0,0.xml')){
			throw new Exception('Flux introuvable');
		}
		if(empty($fluxrss->channel->title) || empty($fluxrss->channel->description) || empty($fluxrss->channel->item->title))
			throw new Exception('Flux invalide');

		echo '<h3>'.(string)$fluxrss->channel->title.'</h3>
				<p>'.(string)$fluxrss->channel->description.'</p>';

		$i = 0;
		$nb_affichage = 5;
		echo '<ul>';
		foreach($fluxrss->channel->item as $item){
			echo '<li><a href="'.(string)$item->link.'">'.(string)$item->title.'</a> <i>publié le'.(string)date('d/m/Y à G\hi',strtotime($item->pubDate)).'</i></li>';
			if(++$i>=$nb_affichage)
				break;
		}
		echo '</ul>';
	}
	catch(Exception $e){
		echo $e->getMessage();
	}

?>

Notre boucle s’effectue sur les éléments item, et affiche donc les 5 items du flux RSS dans une liste d’élément

    . Pour mettre la date dans un format un peu plus compréhensible et facile à lire, il suffit de jouer avec les fonctions strtotime qui convertit la date en timestamp, et la fonction date prenant en paramètre un format et le timestamp.

    Je m’arrêterais là pour la lecture de Flux RSS. Bien entendu, ce script constitue un premier pas. il y’a de nombreuses évolutions à apporter, comme la copie du flux sur son serveur pour accéder aux données de celui-ci beaucoup plus rapidement.

10 commentaires

S'abonner au RSS des commentaires
  1. Jm2t
    Posté le 01/11/2010 à 10h19

    Super.
    Bravo et merci pour ce code.
    Une petite question, est-il possible de limiter l’affichage des items ?

    Par exemple seulement les items dont la catégorie est"toto".
    Merci d’avance,
    Jm2t

  2. eggne
    Posté le 01/08/2010 à 21h46

    Très bon tutoriel. Merci!
    Toutefois il faudrait spécifier que dans la configuration PHP du serveur, vous devez mettre allow url fopen à On. Sinon il n’est pas possible de lire un flux RSS se trouvant sur un serveur distant.

  3. blackg
    Posté le 30/03/2010 à 19h01

    le message d’erreur est le suivant : "warning : failed to load external entity"

  4. blackg
    Posté le 30/03/2010 à 18h56

    hello, merci pour ce trés bon tuto! j’ai une petite question : j’essaie de lire un flux en https mais ça ne fonctionne pas…est-ce qu’il y aurait une manipulation à faire pour le https?

  5. François
    Posté le 02/07/2009 à 23h47

    C’est peut être du à une parenthèse qui n’est pas fermé à la ligne 9 ou un point virgule oublié…

    Généralement pour ce type d’erreur faut chercher la ligne du dessus…

  6. delta
    Posté le 02/07/2009 à 14h33

    hello, ile me retourne ce message d’erreur une idée?

    Parse error: syntax error, unexpected ‘{‘ in /homepages/33/d212168608/htdocs/names/test/afficheRSS.php on line 10

  7. cherrierj
    Posté le 09/04/2009 à 19h00

    tuto très instructif et bien fait.
    merci.

  8. Kazaam
    Posté le 04/03/2009 à 13h18

    D’accord, ça fonctionne bien mieux comme ça je dois dire.

    C’était un peu étonnant que la fonction se limite au flux rss, enfin en tout cas merci beaucoup !

  9. François
    Posté le 04/03/2009 à 11h46

    En fait quand tu charges ton document xml avec simplexml, il charge la racine directement, donc ca devrait marcher quelquesoit le nom de la balise
    Pour ton code ca devrait donner ca:
    $playlist=simplexml_load_file(‘…URL…../taplaylist.xml’);
    Donc si tu as par exemple un document comme ca:
    <?xml….>
    <playlist>
    <music>
    <titre>…</titre>

    <time>…</time>
    </music>
    <music>

    </music>

    </playlist>

    Le principe reste le même, tu accèdes à tes données comme ceci:
    $playlist->music->titre…

    Essaye aussi d’afficher le contenu de ton objet simpleXML (var_dump($playlist)), ca peut être utile.

    Bon tests!

  10. Kazaam
    Posté le 04/03/2009 à 0h34

    Très bon article, merci !

    Est-il possible d’extraire des données d’un fichier xml ne contenant pas de balise <rss> ?

    Je travaille sur un fichier playlist de lecteur mp3 qui ne contient justement pas cette balise. Après plusieurs tests il s’avère que c’est bien cet élément qui pose problème.

    Merci de la réponse.

Laisser un commentaire

Votre e-mail ne sera jamais publié ni communiqué. Les champs obligatoires sont indiqués par *

*
*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>