RSS parser.
Parses RSS into an array. Quick and nasty but does the job.
No checking is done for correct Tags, only correct XML.
PHP4 needed to display result (uses print_r).
// define hooks to rss_parser class as xml functions do not allow object methods as handlers.
function rss_start_element($parser, $name, $attributes) {
global $rss;
$rss->start_element($parser, $name, $attributes);
}
function rss_end_element($parser, $name) {
global $rss;
$rss->end_element($parser, $name);
}
function rss_character_data($parser, $data) {
global $rss;
$rss->character_data($parser, $data);
}
class rss_parser {
// constructor. setup parser options and handlers.
function rss_parser() {
$this->error = '';
$this->file = '';
function character_data($parser, $data) {
if (empty($this->data)) $this->data = trim($data); // concatenate non-parsed data...
else $this->data .= ' '.trim($data); // and get rid of white space.
}
function start_element($parser, $name, $attrs) {
switch($name) {
case 'RSS':
break;
case 'CHANNEL':
break;
case 'IMAGE':
array_push($this->stack, $name);
break;
case 'TEXTINPUT':
array_push($this->stack, $name);
break;
default:
array_push($this->stack, $name);
break;
}
}
function end_element($parser, $name) {
switch ($name) {
case 'RSS':
break;
case 'CHANNEL':
break;
case 'IMAGE':
array_pop($this->stack);
break;
case 'ITEM':
array_pop($this->stack);
array_pop($this->stack);
break;
case 'TEXTINPUT':
array_pop($this->stack);
break;
default: // child element.
$element = (implode("']['",$this->stack));
eval("\$this->channel['$element']=\$this->data;"); // this does all the hard work.
array_pop($this->stack);
$this->data = '';
break;
}
}
function parse() {
if (!($fp = @fopen($this->file, "r"))) {
$this->error = "Could not open RSS source \"$this->file\".";
return false;
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($this->xml_parser, $data, feof($fp))) {
$this->error = sprintf("XML error: %s at line %d.",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser));
return false;
}
}
xml_parser_free($this->xml_parser);
return true;
}
} // class rss_parser.
// try it out...
$rss = new rss_parser();
$rss->file = 'http://freebsddiary.org/news.php3';
$rss->parse() or die($rss->error);
if ($rss->error) print $rss->error;
print_r($rss->channel); // PHP 4 needed for this to work.
?>