Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LECTEUR DE FIL RSS (XML) SIMPLE EN UN SEUL FICHIER SOURCE.


Information sur la source

Catégorie :Xml Niveau : Débutant Date de création : 25/03/2004 Vu : 19 145

Note :
8,23 / 10 - par 13 personnes
8,23 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (56)
Ajouter un commentaire et/ou une note


Description

Lecteur de Fil RSS (XML) :

Si vous disposez d'un Blog (par exemple chez ublog.com) vous pouvez récupérer le contenu de votre fil RSS et le publier directement sur  votre site en PHP en important les données de votre fichier RSS.
Pour les utilisateurs de UBlog l'adresse de votre fichier RSS ou fil RSS  s'obtient en cliquant sur l'icone rouge "XML". Je suppose que c'est pareil pour les autres blogger.

On notera au passage que c'est justement l'objectif de la norme RSS de permettre la syndication simple de données ;-).

De ce fait,  vous pouvez aussi bien utiliser  le programme pour afficher n'importe quel fil RSS : il suffit d'avoir l'adresse

Voici un exemple d'importation de notre fil RSS sur notre Blog vers  notre site Web :

<a href="http://www.itcom3.com/PHPRSSReader.php?rssurl=http://ublog.com/itcom3/rss">http://www.itcom3.com/PHPRSSReader.php?rssurl=http://ublog.com/itcom3/rss</a>



Comment procéder :

Avec votre éditeur préféré, créez un fichier PHP par exemple "PHPRSSReader.php" vide.

Copiez et collez le code source ci-dessous. Modifier juste la variable $rssurl  pour pointer sur votre fil RSS au cas ou il n'y aurait pas d'argument "rssurl" de renseigné dans l'adresse.

Sauvegardez votre page et placer la sur votre site avec votre outil FTP préféré.

A+

Pierre


 

Source

  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
  • <?php
  • /////////////////////////////////////////////////////////////////////////////////
  • // PHPRSSReader.php - d'après HTML Reader par Jorge Solis
  • // traduit et simplifié par Pierre Rouarch pour tenir en un fichier
  • ////////////////////////////////////////////////////////////////////////////////
  • class xml {
  • var $parser;
  • function parse($xmlstring){
  • $this->parser = xml_parser_create();
  • xml_set_object($this->parser, $this);
  • xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
  • xml_set_element_handler($this->parser, "tag_open", "tag_close");
  • xml_set_character_data_handler($this->parser, "cdata");
  • // Initialisation
  • $this->node_stack = array();
  • $this->tag_open(null, "root", array());
  • xml_parse($this->parser, $xmlstring);
  • xml_parser_free($this->parser);
  • $rnode = array_pop($this->node_stack);
  • return($rnode);
  • }
  • function tag_open($parser, $tag, $attributes){
  • // creation d'un nouveau node...
  • $node = array();
  • $node["_NAME"] = $tag;
  • foreach ($attributes as $key => $value) {
  • $node[$key] = $value;
  • }
  • $node["_DATA"] = "";
  • $node["_ELEMENTS"] = array();
  • // ajouter le nouveau node à la fin de la pile de node
  • array_push($this->node_stack, $node);
  • }
  • function cdata($parser, $cdata){
  • // ajouter les données au dernier node de la pile
  • $lastnode = count($this->node_stack);
  • $this->node_stack[$lastnode-1]["_DATA"] .= $cdata;
  • }
  • function tag_close($parser, $tag){
  • // suppression de la pile
  • $node = array_pop($this->node_stack);
  • $node["_DATA"] = trim($node["_DATA"]);
  • // and ajout comme élément à la fin de la pile...
  • $lastnode = count($this->node_stack);
  • array_push($this->node_stack[$lastnode-1]["_ELEMENTS"], $node);
  • }
  • } // end of class xml
  • // recupération de l' adresse du RSS avec le paramètre rssurl
  • $rssurl = $HTTP_GET_VARS["rssurl"];
  • //////////////////////////////////////////////////////////////////////////////////////////////////
  • //Modifiez ici pour mettre l'adresse URL de votre RSS au cas ou aucun argument n'est passé:
  • // exemple :
  • // http://www.votresite.com/PHPRSSReader.php?rssurl=http://www.votresite.com/votrefichierrss
  • /////////////////////////////////////////////////////////////////////////////////////////////
  • if (!$rssurl ) $rssurl = "http://www.u-blog.net/itcom3/rss";
  • // récupération du fichier par paquets de 4096
  • $fp = fopen($rssurl, "r");
  • while (!feof ($fp)) $data .= fgets($fp, 4096);
  • fclose ($fp);
  • $initPos = strpos($data, "<channel>"); // Saut de l'entête
  • //parse les données
  • $xml_parser = new xml();
  • $data = substr($data, $initPos);
  • $root_node = $xml_parser->parse($data);
  • $channel = array_shift($root_node["_ELEMENTS"]);
  • //Récupération de certaines données du RSS (Voir les specifications rss 0.91, 0.92 et 2.0)
  • ////// Récupération entête de channel /////////////////////////////////////////////////////////
  • foreach ($channel["_ELEMENTS"] as $item){
  • // suppression des antislashs
  • if($item[_NAME]=="title") $base_name=stripslashes($item[_DATA]);
  • if($item[_NAME]=="link") $base_url=stripslashes($item[_DATA]);
  • if($item[_NAME]=="description") $base_desc=stripslashes($item[_DATA]);
  • }
  • $base = "<b>Web: </b><a href=\"$base_url\" target=\"_new\">$base_name</a><br>$base_desc<br>";
  • /////////////////////////////////////////////////////////////////////////
  • ////////// Récupération de chaque Item --> titre, adresse url, date de publication, description //////////////////////////////////////////////////////
  • foreach ($channel["_ELEMENTS"] as $item){
  • if($item[_NAME]=="item") {
  • // suppression des antislashs
  • foreach ($item["_ELEMENTS"] as $tag){
  • if($tag["_NAME"]=="title") $news_title=stripslashes($tag[_DATA]);
  • if($tag["_NAME"]=="link") $news_url=stripslashes($tag[_DATA]);
  • if($tag["_NAME"]=="pubDate") $news_pubDate=stripslashes($tag[_DATA]);
  • if($tag["_NAME"]=="description") $news_desc=stripslashes($tag[_DATA]);
  • }
  • $news .= "<p>$news_pubDate<br><b>$news_title</b><br>$news_desc<br><a href=\"$news_url\" target=\"_new\">$news_url</a><hr></p>";
  • }
  • }
  • ////////////////////////////////////////////////////////////////////////////////
  • ?>
  • <html>
  • <head>
  • <title>Sample RSS Reader in PHP</title>
  • <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  • </head>
  • <body>
  • <?php print($news) ?>
  • <?php print($base) ?>
  • </body>
  • </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?php
/////////////////////////////////////////////////////////////////////////////////
// PHPRSSReader.php - d'après HTML Reader par  Jorge Solis 
// traduit et simplifié par Pierre Rouarch pour tenir en un fichier
////////////////////////////////////////////////////////////////////////////////

class xml {
 var $parser;
 function parse($xmlstring){
  $this->parser = xml_parser_create();
  xml_set_object($this->parser, $this);
  xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
  xml_set_element_handler($this->parser, "tag_open", "tag_close");
  xml_set_character_data_handler($this->parser, "cdata");

  // Initialisation
        $this->node_stack = array();
        $this->tag_open(null, "root", array());

        xml_parse($this->parser, $xmlstring);
        xml_parser_free($this->parser);

        $rnode = array_pop($this->node_stack);
 
        return($rnode);
 }

 function tag_open($parser, $tag, $attributes){
        // creation d'un nouveau node...
        $node = array();
        $node["_NAME"]      = $tag;
        foreach ($attributes as $key => $value) {
            $node[$key] = $value;
        }
        $node["_DATA"]      = "";
        $node["_ELEMENTS"]  = array();

        // ajouter le nouveau node à la fin de la pile de node
        array_push($this->node_stack, $node);  
 }

 function cdata($parser, $cdata){
  // ajouter les données au dernier node de la pile
        $lastnode = count($this->node_stack);
        $this->node_stack[$lastnode-1]["_DATA"] .= $cdata;
 }

 function tag_close($parser, $tag){
  // suppression de la pile 
        $node = array_pop($this->node_stack);
        $node["_DATA"] = trim($node["_DATA"]);

        // and ajout comme élément à la fin de la pile...
        $lastnode = count($this->node_stack);
        array_push($this->node_stack[$lastnode-1]["_ELEMENTS"], $node);
 }
} // end of class xml

 

// recupération de l' adresse du RSS avec le paramètre rssurl
$rssurl = $HTTP_GET_VARS["rssurl"];
//////////////////////////////////////////////////////////////////////////////////////////////////
//Modifiez ici pour mettre l'adresse URL de votre RSS au cas ou aucun argument n'est passé:
// exemple :
// http://www.votresite.com/PHPRSSReader.php?rssurl=http://www.votresite.com/votrefichierrss
/////////////////////////////////////////////////////////////////////////////////////////////
if (!$rssurl ) $rssurl = "http://www.u-blog.net/itcom3/rss";

// récupération du fichier par paquets de 4096
  $fp = fopen($rssurl, "r");
  while (!feof ($fp)) $data .= fgets($fp, 4096);
  fclose ($fp);
  $initPos = strpos($data, "<channel>"); // Saut de l'entête

 //parse les données
 
 $xml_parser = new xml();
 $data = substr($data, $initPos);
 $root_node = $xml_parser->parse($data);
 $channel    = array_shift($root_node["_ELEMENTS"]);

 //Récupération  de certaines données du RSS (Voir les specifications rss 0.91, 0.92 et  2.0)
 ////// Récupération entête de channel  /////////////////////////////////////////////////////////
 foreach ($channel["_ELEMENTS"] as $item){ 
// suppression des antislashs
 if($item[_NAME]=="title") $base_name=stripslashes($item[_DATA]);
 if($item[_NAME]=="link") $base_url=stripslashes($item[_DATA]);
 if($item[_NAME]=="description") $base_desc=stripslashes($item[_DATA]);
}
  $base = "<b>Web: </b><a href=\"$base_url\" target=\"_new\">$base_name</a><br>$base_desc<br>";
 /////////////////////////////////////////////////////////////////////////
 ////////// Récupération de chaque Item  --> titre, adresse url, date de publication, description //////////////////////////////////////////////////////
 foreach ($channel["_ELEMENTS"] as $item){ 
 
 if($item[_NAME]=="item") {
  // suppression des antislashs  
  foreach ($item["_ELEMENTS"] as $tag){
    if($tag["_NAME"]=="title") $news_title=stripslashes($tag[_DATA]);
    if($tag["_NAME"]=="link") $news_url=stripslashes($tag[_DATA]);
    if($tag["_NAME"]=="pubDate") $news_pubDate=stripslashes($tag[_DATA]);
     if($tag["_NAME"]=="description") $news_desc=stripslashes($tag[_DATA]);
  }
  $news .= "<p>$news_pubDate<br><b>$news_title</b><br>$news_desc<br><a href=\"$news_url\" target=\"_new\">$news_url</a><hr></p>";  
 }
 }
 ////////////////////////////////////////////////////////////////////////////////
?>
<html>
<head>
<title>Sample RSS Reader in PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>

 

<?php print($news) ?>
<?php print($base) ?>

</body>
</html>


Conclusion

Voilà c'est pas compliqué !

Remerciements à Free pour l'hébergement PHP et à Ublog pour l'hébergement de mon Blog.
 

Commentaires et avis

signaler à un administrateur
Commentaire de lumesh le 26/03/2004 04:50:20

mais c koi cette maladie des blogs ?!  depuis un ptit moment on en voit partout c marrant qd meme comme si il y avait un appel a la populos pour utiliser des blogs.
un peu comme le XML ki na rien de specialement necessaire, mais tt le monde maintenant en colle pour tout et rien. c vraiment bizare. .....
ou alors c pr faire comme tt le monde enfin je ne pige pas cette proliferation de blogs et surtout lutilisation massive d'XML ki ne permet pas non plus de faire du stockage massif dinformations ...
enfin bon ...

signaler à un administrateur
Commentaire de itcom3 le 26/03/2004 08:43:38

J'en conviens,  je suis un peu fashion victim.

D'un autre côté le phénomène Blog, Wiki, push, feedRSS et autres partages et syndications de données donne un petit coup de frais au web en permettant notamment  à des non techniciens d'avoir une présence sur le Net.

A+

Pierre

signaler à un administrateur
Commentaire de OriOn le 26/03/2004 21:54:02 administrateur CS

Les blogs ça fait plus de 5 ans que ça existe aux US.
Et en france c'était simplement une page de news.

On a juste changé le nom comme on le fait pour quoi que ce soit aujourd'hui en France.

signaler à un administrateur
Commentaire de ADPro22 le 05/04/2004 22:45:38

Ok si vous ne disposez pas de de processeur xslt là où est hébergé votre site.
Mais sinon, il me semble plus simple d'écrire une feuille de style xslt et de la processer ensuite avec sablotron, dom, xsltproc....

signaler à un administrateur
Commentaire de OriOn le 06/04/2004 09:09:31 administrateur CS

Sablotron point de vue performance à éviter quand même :)

signaler à un administrateur
Commentaire de NiK le 04/10/2004 20:56:04

Moi je trouve le système de feedRSS très interressant, et ton reader est fort sympathique et on est pas obliger de l'utiliser dans un Blog...

signaler à un administrateur
Commentaire de itcom3 le 05/10/2004 18:28:24

Merci pour les encouragements,

Pierre

signaler à un administrateur
Commentaire de OriOn le 05/10/2004 21:14:50 administrateur CS

Pour une fois qu'il y a une source intéressante sur phpcs :) (non je suis pas mauvaise langue :p)

signaler à un administrateur
Commentaire de JulioDelphi le 10/01/2005 14:29:46 administrateur CS

OriOn : je suis d'accord :p
moi elle me plait vraument trop cette source !
10/10 ça le mérite
Bien joué pierre, tres bon travail

signaler à un administrateur
Commentaire de itcom3 le 10/01/2005 15:55:25

Merci encore

Pierre

signaler à un administrateur
Commentaire de jaristote le 17/05/2005 12:36:06

Bonjour
J'ai l'erreur suivante:
Notice: Use of undefined constant _NAME - assumed '_NAME'
Notice: Use of undefined constant _DATA - assumed '_DATA'

Un pb de déclaration? merci de votre aide.

signaler à un administrateur
Commentaire de itcom3 le 17/05/2005 17:51:25

Bonjour,

Je pense que c'est parcequ'il manque des guillemets ou des simples quotes à certains endroits.
(même si cela marche la plupart du temps)
Tu peux par exemple changer les $item[_NAME]  en $item['_NAME']ou $item["_NAME"]la même chose pour les
$item[_DATA]

Cordialement

Pierre

signaler à un administrateur
Commentaire de larion le 19/05/2005 13:38:40

Bonjour,

Je rencontre un problème : pour certain flux rss, les caractères accentués ne s'affichent pas correctement.
Exemple de flux : http://www.blue-hardware.com/rss.xml
Je pense que cela viens de la première ligne du flux : <?xml version="1.0" encoding="UTF-8"?>
Comment détécter et résoudre ce problème automatiquement ?

Cordialement, Larion

signaler à un administrateur
Commentaire de itcom3 le 19/05/2005 18:11:08

// Il faut tout d'abord récupérer le charset dans le flux XML:
// et se positionner sur encoding


//après : (mligne 74)
fclose ($fp);
  


  $charset ="";
  $charset = strstr($data, "encoding");  
  $charset = strstr($charset, "=");
  $charset = strstr($charset, "\"");
  $charset = substr("$charset",1,30);
  $charset = substr("$charset",0,strpos($charset,"\""));
  
   if ($charset=="") $charset="UTF-8";  // au choix si charset non trouvé ou iso-8859-1

// et avant :
$initPos = strpos($data, "<channel>"); // Saut de l'entête


// ensuite dans l'entête HTML


<title>Sample RSS Reader in PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $charset ?>">
</head>
<body>

A+

Pierre

signaler à un administrateur
Commentaire de larion le 19/05/2005 18:43:39

Merci pour la reponse.
J'ai omis de dire que j'affichais plusieurs RSS sur la même page.
Tous sont au bon 'charset' sauf un (charset="UTF-8").
Cependant j'ai dans ton code la détection.
Je pense qu'en utilisant la fonction utf8_decode($data) je devrai arriver à mes fins.

signaler à un administrateur
Commentaire de itcom3 le 19/05/2005 19:52:50

Si tu veux gérer plusieurs charsets il existe une classe PHP permettant de transformer
de l'UTF-8 dans d'autres encodages et inversement :

http://www.phpclasses.org/browse/package/1974.html

Cordialement

signaler à un administrateur
Commentaire de aysoon le 06/06/2005 09:07:06

Bonjour,
Sauriez-vous comment combiner plusieurs flux rss en les classant par ordre décroissant de date de publication??
Sinon bravo pour votre source fort sympathique.
aysoon.

signaler à un administrateur
Commentaire de romalafrite le 26/10/2005 14:16:42

C'est... original


Notice: Undefined index: rssurl in c:\program files\easyphp1-7\www\rss\index.php on line 63

Warning: fopen(http://www.u-blog.net/itcom3/rss): failed to open stream: Bad file descriptor in c:\program files\easyphp1-7\www\rss\index.php on line 72

Warning: feof(): supplied argument is not a valid stream resource in c:\program files\easyphp1-7\www\rss\index.php on line 73

Warning: fgets(): supplied argument is not a valid stream resource in c:\program files\easyphp1-7\www\rss\index.php on line 73

Notice: Undefined variable: data in c:\program files\easyphp1-7\www\rss\index.php on line 73

Warning: feof(): supplied argument is not a valid stream resource in c:\program files\easyphp1-7\www\rss\index.php on line 73

Warning: fgets(): supplied argument is not a valid stream resource in c:\program files\easyphp1-7\www\rss\index.php on line 73

signaler à un administrateur
Commentaire de pouda le 18/01/2006 22:08:58

super efficace !! 10/10 source bien commenté vraiment top...

signaler à un administrateur
Commentaire de satellite34 le 12/05/2006 03:29:01

Sympa, les wxdeveloppeurs te remercient. 10/10

signaler à un administrateur
Commentaire de PaTaTe le 23/06/2006 04:32:24

Je viens de mettre à jour PHP et un gros problème survient à l'affichage de ce code chez moi : Une opération non conforme !

J'ai migré vers PHP 4.4.2 (avant j'avais PHP 4.4.1)

Quelqu'un aurait-il une explication à cela ?

Merci

signaler à un administrateur
Commentaire de jpf01 le 17/08/2006 07:11:47

Fichier tres utile pour un amateur novice en RSS.
Son installation ne m'a pose aucun probleme. Merci à l'artiste.
Une question cependant. En essayant d'afficher les news de GOOGLE en français, le fichier transforme les accents...par des signes.
Que dois-je modifier pour que les accents soient compris?
Merci d'avance. Jean-Pierre

signaler à un administrateur
Commentaire de itcom3 le 17/08/2006 10:37:01

Tu peux essayer ceci :

/ Il faut tout d'abord récupérer le charset dans le flux XML:
// et se positionner sur encoding


//après : (mligne 74)
fclose ($fp);
  


  $charset ="";
  $charset = strstr($data, "encoding");  
  $charset = strstr($charset, "=");
  $charset = strstr($charset, "\"");
  $charset = substr("$charset",1,30);
  $charset = substr("$charset",0,strpos($charset,"\""));
  
   if ($charset=="") $charset="UTF-8";  // au choix si charset non trouvé ou iso-8859-1

// et avant :
$initPos = strpos($data, "<channel>"); // Saut de l'entête


// ensuite dans l'entête HTML


<title>Sample RSS Reader in PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $charset ?>">
</head>
<body>

A+

Pierre

signaler à un administrateur
Commentaire de wam666 le 24/09/2006 18:07:57

Excellente source!!!

signaler à un administrateur
Commentaire de benj3838 le 09/04/2007 15:40:34

Salut a tous et merci dans un premier temps pour cette source interessante si mes quelques problèmes sont résolus.
Effectivement, j'ai quelques erreures :
Notice: Undefined variable: HTTP_GET_VARS in C:\Program Files\EasyPHP 2.0b1\www\site anticlimax\site\pages\news.php on line 63

Notice: Undefined variable: data in C:\Program Files\EasyPHP 2.0b1\www\site anticlimax\site\pages\news.php on line 73

Notice: Undefined variable: news in C:\Program Files\EasyPHP 2.0b1\www\site anticlimax\site\pages\news.php on line 105

HELP !!

et merci encore
benj3838

signaler à un administrateur
Commentaire de itcom3 le 12/04/2007 07:07:28

Bonjour,

Est-ce que tu n'aurais pas virfer les "$" des noms de variables par hasard ?

A+

Pierre

signaler à un administrateur
Commentaire de benj3838 le 12/04/2007 18:15:41

Salut et merci de ta première réponse mais non je n'ai pas viré les $ :

Voici la copie de chacunes de ces lignes :

L63 : $rssurl = $HTTP_GET_VARS["rssurl"];

L73: while (!feof ($fp)) $data .= fgets($fp, 4096);

L105 : $news .= "<p>$news_pubDate<br><b>$news_title</b><br>$news_desc<br><a href=\"$news_url\" target=\"_new\">$news_url</a><hr></p>";

Merci d'avance

Benj3838

signaler à un administrateur
Commentaire de itcom3 le 13/04/2007 00:58:21

C'est peut être un pb d'étendue de variable si tu as mis le source dans une fonction où que ta version de PHP est inféfieure à 4

Voir de l'info ici :

http://www.php.net/manual/en/language.variables.scope.php

signaler à un administrateur
Commentaire de benj3838 le 15/04/2007 11:18:43

Salut,

J'ai tester avec la dernière vertion d'easy php qui est en php 5 et ça me donne les mêmes erreures.
C'est une vertion beta mais je pense que vu que j'ai exactement les mêmes erreures c'est pas le fait qu'elle soit en beta qui me donne ces erreurs.

En même temps je pense que je vais cacher ces messages d'erreur avec un @ car le code a l'aire de marcher très bien a part l'affichage de ces messages.

merci encore.

BEnj3838

signaler à un administrateur
Commentaire de itcom3 le 15/04/2007 19:22:44

Bon si c'est seulement des  warnings va pour le @ bien que ce ne soit pas très propre. ;-(

J'avoue que je ne vois d'où vient le pb car je n'arrive pas à reproduire cette erreur.

signaler à un administrateur
Commentaire de benj3838 le 15/04/2007 19:26:16

Salut

Si tu veu reproduire l'erreur

prend nimporte quel easy php

et ce code ou j'ai déjà modifié :
$item[_NAME]  en $item["_NAME"]la même chose pour les
$item[_DATA]

je te le copie ci dessous :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?php
/////////////////////////////////////////////////////////////////////////////////
// PHPRSSReader.php - d'après HTML Reader par Jorge Solis
// traduit et simplifié par Pierre Rouarch pour tenir en un fichier
////////////////////////////////////////////////////////////////////////////////

class xml {
var $parser;
function parse($xmlstring){
$this->parser = xml_parser_create();
xml_set_object($this->parser, $this);
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($this->parser, "tag_open", "tag_close");
xml_set_character_data_handler($this->parser, "cdata");

// Initialisation
$this->node_stack = array();
$this->tag_open(null, "root", array());

xml_parse($this->parser, $xmlstring);
xml_parser_free($this->parser);

$rnode = array_pop($this->node_stack);

return($rnode);
}

function tag_open($parser, $tag, $attributes){
// creation d'un nouveau node...
$node = array();
$node["_NAME"] = $tag;
foreach ($attributes as $key => $value) {
$node[$key] = $value;
}
$node["_DATA"] = "";
$node["_ELEMENTS"] = array();

// ajouter le nouveau node à la fin de la pile de node
array_push($this->node_stack, $node);
}

function cdata($parser, $cdata){
// ajouter les données au dernier node de la pile
$lastnode = count($this->node_stack);
$this->node_stack[$lastnode-1]["_DATA"] .= $cdata;
}

function tag_close($parser, $tag){
// suppression de la pile
$node = array_pop($this->node_stack);
$node["_DATA"] = trim($node["_DATA"]);

// and ajout comme élément à la fin de la pile...
$lastnode = count($this->node_stack);
array_push($this->node_stack[$lastnode-1]["_ELEMENTS"], $node);
}
} // end of class xml



// recupération de l' adresse du RSS avec le paramètre rssurl
$rssurl = $HTTP_GET_VARS["rssurl"];
//////////////////////////////////////////////////////////////////////////////////////////////////
//Modifiez ici pour mettre l'adresse URL de votre RSS au cas ou aucun argument n'est passé:
// exemple :
// http://www.votresite.com/PHPRSSReader.php?rssurl=http://www.votresite.com/votrefichierrss
/////////////////////////////////////////////////////////////////////////////////////////////
if (!$rssurl ) $rssurl = "http://test-news-site.ublog.com/un_blog_de_test_pour_fair/rss.xml";

// récupération du fichier par paquets de 4096
$fp = fopen($rssurl, "r");
while (!feof ($fp)) $data .= fgets($fp, 4096);
fclose ($fp);
$initPos = strpos($data, "<channel>"); // Saut de l'entête

//parse les données

$xml_parser = new xml();
$data = substr($data, $initPos);
$root_node = $xml_parser->parse($data);
$channel = array_shift($root_node["_ELEMENTS"]);

//Récupération de certaines données du RSS (Voir les specifications rss 0.91, 0.92 et 2.0)
////// Récupération entête de channel /////////////////////////////////////////////////////////
foreach ($channel["_ELEMENTS"] as $item){
// suppression des antislashs
if($item["_NAME"]=="title") $base_name=stripslashes($item["_DATA"]);
if($item["_NAME"]=="link") $base_url=stripslashes($item["_DATA"]);
if($item["_NAME"]=="description") $base_desc=stripslashes($item["_DATA"]);
}
$base = "<b>Web: </b><a href=\"$base_url\" target=\"_new\">$base_name</a><br>$base_desc<br>";
/////////////////////////////////////////////////////////////////////////
////////// Récupération de chaque Item --> titre, adresse url, date de publication, description //////////////////////////////////////////////////////
foreach ($channel["_ELEMENTS"] as $item){

if($item["_NAME"]=="item") {
// suppression des antislashs
foreach ($item["_ELEMENTS"] as $tag){
if($tag["_NAME"]=="title") $news_title=stripslashes($tag["_DATA"]);
if($tag["_NAME"]=="link") $news_url=stripslashes($tag["_DATA"]);
if($tag["_NAME"]=="pubDate") $news_pubDate=stripslashes($tag["_DATA"]);
if($tag["_NAME"]=="description") $news_desc=stripslashes($tag["_DATA"]);
}
$news .= "<p>$news_pubDate<br><b>$news_title</b><br>$news_desc<br><a href=\"$news_url\" target=\"_new\">$news_url</a><hr></p>";
}
}
////////////////////////////////////////////////////////////////////////////////
?>
<html>
<head>
<title>Sample RSS Reader in PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>



<?php print($news) ?>
<?php print($base) ?>

</body>
</html>

Voila a+ et merci encore pour ton aide

Benj3838

signaler à un administrateur
Commentaire de mitchoumy le 20/06/2007 10:28:53

Salut Benj3838,
j'ai eu moi aussi cette erreur...
La seule solution que j'ai trouvé est la suivante:
Le script réclamant une valeur pour ces variables je lui en ai donné lol
j'ai rajouté $data =""; et $news =""; ici :

$rssurl = "test.xml";
$data ="";
$news ="";
// récupération du fichier par paquets de 4096
$fp = gzopen($rssurl, "r");

Et j'ai supprimé ces 2 lignes :
// recupération de l' adresse du RSS avec le paramètre rssurl
$rssurl = $HTTP_GET_VARS["rssurl"];

Et impec lol !
Mais je pense que j'arrive pas un peu tard...

signaler à un administrateur
Commentaire de mitchoumy le 20/06/2007 10:38:54

Par contre j'ai un probleme pour lire les flux provenant d'url du type :

http://www.exemple.com/rss.php?id=categorie&lib=type

J'ai une erreur du type :

Warning: fopen(http://www.exemple.com/rss.php?id=categorie&lib=type): failed to open stream: Bad file descriptor in c:\program files\easyphp1-8\www\test\index.php on line 73

Warning: feof(): supplied argument is not a valid stream resource in c:\program files\easyphp1-8\www\test\index.php on line 74

Warning: fgets(): supplied argument is not a valid stream resource in c:\program files\easyphp1-8\www\test\index.php on line 74

Et les 2 derniers warning sont répétés indéfiniment...

Je me doute que c'est parce que le lien ne pointe pas directement vers un fichier *.xml mais y aurait-il une solution ?

Merci !

signaler à un administrateur
Commentaire de mitchoumy le 20/06/2007 10:42:52

Une derniere demande ...

J'ai un fil qui est compressé en GZIP comment dois-je faire pour l'exploiter ?
Car le script tel qu'il est proposé n'a pas l'air d'avoir prévu cette eventualité...
Sachant que j'ai deja echanger les instructions fopen pour gzopen , feof pour gzeof , fgets pour gzgets et fclose pour gzclose.

En attendant vos réponses...
Merci encore.

signaler à un administrateur
Commentaire de benj3838 le 20/06/2007 12:05:21

Effectivement mitchoumy j'ai déjà créer un code bien mieu qui permet d'écrire les nex directement dur le site avec une police adaptée la couleur que je veux et la disposition que je veux. C'est pas très dur l'écriture dans les fichiers html en php !
sur ceux a++
et bonne continuation.
BEnj3838

signaler à un administrateur
Commentaire de pyrrah le 09/08/2007 13:05:32

Des erreurs sur le site de démo.
Sympa, simple et rapide la source.
8/10.

Bonne continuation ;)

signaler à un administrateur
Commentaire de haflinger2 le 01/12/2007 01:24:15 9/10

salut

comment limiter le nombre d'élément ?
cad mettre juste 5 titres d'article par exemple au lieu de tout ceux du flux RSS ?

merci

signaler à un administrateur
Commentaire de itcom3 le 01/12/2007 08:08:53

il suffit de mettre un compteur dans la boucle :

foreach ($channel["_ELEMENTS"] as $item){

et sortir si  > 5

signaler à un administrateur
Commentaire de haflinger2 le 01/12/2007 17:46:03

salut

merci

C'est à dire un compteur ?
peut tu me mettre le code à insérer ?

je suis un novice

hf

signaler à un administrateur
Commentaire de itcom3 le 02/12/2007 11:27:59

Par exemple

//////////////////////////////////
$nbnews=5;
$ncount=0;

foreach ($channel["_ELEMENTS"] as $item) {

if (($item[_NAME]=="item") and ($ncount < $nbnews) ) {

// suppression des antislashs

foreach ($item["_ELEMENTS"] as $tag){

if($tag["_NAME"]=="title") $news_title=stripslashes($tag[_DATA]);
if($tag["_NAME"]=="link") $news_url=stripslashes($tag[_DATA]);
if($tag["_NAME"]=="pubDate") $news_pubDate=stripslashes($tag[_DATA]);
if($tag["_NAME"]=="description") $news_desc=stripslashes($tag[_DATA]);

}

    $ncount++;
$news .= "<p>$news_pubDate<br><b>$news_title</b><br>$news_desc<br><a href=\"$news_url\" target=\"_new\">$news_url</a><hr></p>";
}
}
//////

signaler à un administrateur
Commentaire de haflinger2 le 02/12/2007 17:03:17

salut

merci bc !

signaler à un administrateur
Commentaire de jphilippev le 17/12/2007 16:52:34

euh... ca a l'air d'etre bien cette source... euh... mais on la met ou l'adresse du flux? quand on genere pas le flux nous meme bien sur!! j'ai jamais travailler avec les flux c'est ma premiere fois :D

signaler à un administrateur
Commentaire de itcom3 le 17/12/2007 17:08:03

Bjr,

C'est marqué dans les commentaires et dans le source lui même.

Soit vous passez le paramètre dans l'URL du lecteur :

http://www.monsite.com/PHPRSSReader.php?rssurl=http://toto.com/fluxrss.xml

Soit dans le source vous forcez un site (Ligne 69) :
if (!$rssurl ) $rssurl = "http://toto.com/fluxrss.xml";

signaler à un administrateur
Commentaire de jphilippev le 17/12/2007 17:39:38

merci itcom3

j'ai bien modifié le code mais ca me renvoi une erreur plus haut

Notice: Undefined variable: HTTP_GET_VARS in C:\Program Files\EasyPHP 2.0b1\www\essai php\script_espace_membres\filrss.php on line 51

moi j'ai fait ca :

$rssurl = $HTTP_GET_VARS["rssurl"];
//////////////////////////////////////////////////////////////////////////////////////////////////
//Modifiez ici pour mettre l'adresse URL de votre RSS au cas ou aucun argument n'est passé:
// exemple :
// http://www.votresite.com/PHPRSSReader.php?rssurl=http://www.votresite.com/votrefichierrss
/////////////////////////////////////////////////////////////////////////////////////////////
if (!$rssurl ) $rssurl = "http://www.lemonde.fr/rss/sequence/0,2-3210,1-0,0.xml";

merci

signaler à un administrateur
Commentaire de itcom3 le 17/12/2007 17:56:56

Essaye $_GET au lieu de $HTTP_GET_VARS

Pierre

signaler à un administrateur
Commentaire de jphilippev le 17/12/2007 18:04:43

ca revient au meme

signaler à un administrateur
Commentaire de jphilippev le 17/12/2007 18:06:18 8/10

euh je sais pas si c'est important mais j'appelle ton fichier en include dans une autre page php...

signaler à un administrateur
Commentaire de jphilippev le 17/12/2007 19:14:42

enfin pas tout a fait au meme maintenant ca me dit :

Notice: Undefined index: rssurl in C:\Program Files\EasyPHP 2.0b1\www\essai php\script_espace_membres\filrss.php on line 51

signaler à un administrateur
Commentaire de itcom3 le 18/12/2007 16:03:44

Bon,

1) Remet le source dans le fichier, pour éviter des erreurs supplémentaires

2) essaye plusieurs sources RSS

3) Vérifie la version de ton php (fonction phpinfo()), demande conseil pour savoir si il ne te manque pas un module dans ton php. Vérifie la version de ton PHP par rapport à l'analyseur syntaxique XML et le Charset de la source RSS

4) essaye chez un autre hébergeur avec une autre version de PHP

signaler à un administrateur
Commentaire de Shinji49 le 25/12/2007 21:27:54 9/10

Bonjour,

Cherchant à développer une parseur de fichiers XML. Je me documente et épluche des scripts déjà existants. Et je suis tombé sur cette source ! Qui ma bien sur ouverte une nouvelle porte... Je doit bien avouer que la class n'est pas clair du tout bien qu'elle fasse bien son travail ! En épluchant la documentation, ce n'est pas plus compréhensible et j'ai remarqué que des bouts de code de la classe étaient tirés directement de la doc php. Est ce que son auteur sait ce que fait son code à chaque ligne ?

Bref, je vous apporte un petit bout de code concernant la détermination du charset car je trouve la methode indiquée un peu bourin... lol

<?
$motif_charset ='#encoding=("|\'?)([[:alnum:]-]{3,15})("|\')?#i';
preg_match($motif_charset,$data,$charset);
if($charset[1] !='')$charset = $charset[2];
else $charset ='iso-8859-15';
?>

Cordialement.

signaler à un administrateur
Commentaire de GREGGRAPH le 27/12/2007 05:17:24

Bonjour,

J'obtiens cette erreur, est ce parce que je suis en PHP5?


Warning: Invalid argument supplied for foreach() in /mnt/w0205/d28/s22/b02c1021/www/marchwoodz.com/test_rss.php on line 72

Warning: Invalid argument supplied for foreach() in /mnt/w0205/d28/s22/b02c1021/www/marchwoodz.com/test_rss.php on line 81
Web:

Est ce qu'il y a quelque chose à modifier?

Merci d'avance pour votre réponse

signaler à un administrateur
Commentaire de GREGGRAPH le 27/12/2007 06:04:58 9/10

Désolé pour le déranement, mon PB est résolu, j'ai juste une petite erreur avec les accents etlas caractères spéciaux. J'ai essayé la méthode décrite plus haut, mais ça ne fonctionne pas!!!

Merci tout de même pour le code, il est nickel !

signaler à un administrateur
Commentaire de Shinji49 le 27/12/2007 15:02:07

Salut Greggraph. Vas voir du coté de la fonction utf8_decode() dans la doc php !

signaler à un administrateur
Commentaire de ennery le 20/01/2008 01:10:15

Salut,

Marche parfaitement en php4, mais en php5 j'ai l'erreur comme GREGGRAPH "Invalid argument supplied for foreach()"

comment résoudre svp ?

signaler à un administrateur
Commentaire de GREGGRAPH le 20/01/2008 01:32:26

Hello,

je suis en sous PHP5
mon erreur provenait de l'adresse du flux RSS que j'avais mal paramétré
vérifie la ligne:
if (!$rssurl ) $rssurl =" "

signaler à un administrateur
Commentaire de ennery le 20/01/2008 03:54:16

re,

je pense que le probleme est ailleurs parce que cela fonctionne sur php4
if (!$rssurl ) $rssurl = "http://www.lemonde.fr/rss/sequence/0,2-3208,1-0,0.xml";

en php4 : echo $channel["_ELEMENTS"] ; me renvoie bien Array
tandis qu'en php5 rien

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Côté IT

    <