PDA

Bekijk Volledige Versie : Iemand een php4 rss parser?



WH-Tim
31/08/07, 16:50
Ik zit alweer een hele middag te klooien met die k*t php4 die de rss nog niet zo goed erin heeft zitten. Heeft iemand misschien een mooie klasse voor me, die correct werkt en zonder fratsen zoals voor ieder item ongeveer 10 subarrays aan te maken?

Jammer dat je dat soort dingen altijd pas aan het eind van je dag vind: http://www.phphulp.nl/php/scripts/4/1101/

Wido
31/08/07, 17:01
Wat offtopic: Waarom draai je uberhaupt nog PHP4?

WH-Tim
31/08/07, 17:56
Omdat ik nog bezig ben met omzetten naar5, maar aangezien de server out of date is ben ik direct bezig met het hele omzetten inclusief nieuw framework op de nieuwe server. Kost allemaal wat werk, duurt allemaal wat langer..

Randy
31/08/07, 17:58
xmlnews.php



<?php
// Foutafhandeling
define(OPEN,"Er is iets fout gegaan bij het openen van de newsfeed.");
define(PARSE,"Er is iets fout gegaan bij het verwerken van de newsfeed.");


// Geef hier de plek van het RSS bestand aan en het aantal berichten dat u wilt tonen.
$rss_file = "rssfeed.xml";
$max_headlines = 99;

//*************************************
// Vanaf hier niets meer veranderen, tenzij u weet waar u mee bezig bent.

class rss_parser {
var $flag = 0;
var $tag = "";
var $cnt=0;
var $max_lines;

// <item>
var $title = "";
var $description = "";
var $link = "";
var $pubdate = "";
// </item>

// <channel>
var $channel_copyright = "";
var $channel_managingeditor = "";
var $channel_language = "";
var $channel_lastbuilddate = "";
// </channel>


function set_max($max) {
$this->max_lines = $max+1;
}

function startElement($parser, $tagname, $attributes) {
$this->tag = $tagname;
if($this->tag == "CHANNEL") {
$this->flag = 1;
}
elseif($this->tag == "ITEM") {
$this->flag = 2;
$this->cnt++;
}
elseif($this->tag == "IMAGE"){
$this->flag = 3; // Dummy
}
}

function endElement($parser, $tagname) {

// If we enter </item>
if($tagname == "ITEM") {
if($this->cnt == $this->max_lines) {
exit();
}

if(empty($this->description)) $this->description = "none";
if(empty($this->pubdate)) $this->pubdate = "unknown";

// Show the news
printf("<p><b>%s</b><br>", htmlspecialchars(trim($this->title)));
printf("%s</p>",htmlspecialchars(trim($this->description)));

unset($this->title);
unset($this->description);
unset($this->link);
unset($this->pubdate);

}

elseif($tagname == "CHANNEL") {
if(empty($this->channel_copyright)) $this->copyright = "unknown";
if(empty($this->channel_managingeditor)) $this->channel_managingeditor = "unknown";
if(empty($this->channel_language)) $this->channel_language = "unknown";
if(empty($this->channel_lastbuilddate)) $this->channel_lastbuilddate = "unknown";
}
}

function characterData($parser, $data) {

if($this->flag == 1) {
switch($this->tag) {
case "LANGUAGE":
$this->channel_language .= $data;
break;
case "LASTBUILDDATE":
$this->channel_lastbuilddate .= $data;
break;
case "COPYRIGHT":
$this->channel_copyright .= $data;
break;
case "MANAGINGEDITOR":
$this->channel_managingeditor .= $data;
break;
}
}
elseif($this->flag == 2) {
switch($this->tag) {
case "TITLE":
$this->title .= $data;
break;
case "DESCRIPTION":
$this->description .= $data;
break;
case "LINK":
$this->link .= $data;
break;
case "PUBDATE":
$this->pubdate .= $data;
break;
}
}
}
}

$xp = xml_parser_create();
$rss_parser = new rss_parser();
xml_set_object($xp,$rss_parser);

xml_parser_set_option($xp, XML_OPTION_SKIP_WHITE, TRUE);
xml_set_element_handler($xp, "startElement", "endElement");
xml_set_character_data_handler($xp, "characterData");
$rss_parser->set_max($max_headlines);

if($fp = @fopen($rss_file,"r")) {
fflush($fp);

while($data = fread($fp, 4096)) {
if(!(xml_parse($xp, trim($data), feof($fp))))
die(sprintf("%s <b>%s</b>",PARSE, $rss_file));
}
fclose($fp);
xml_parser_free($xp);
}
else
die(sprintf("%s <b>%s</b>",OPEN,$rss_file));
?>