PHP Classes

File: rss_parser.php

Recommend this page to a friend!
  Classes of Herman Veluwenkamp   RSS_Parser   rss_parser.php   Download  
File: rss_parser.php
Role: ???
Content type: text/plain
Description: Try it out. Needs PHP4 (uses print_r).
Class: RSS_Parser
Parses RSS into an array.
Author: By
Last change:
Date: 24 years ago
Size: 3,182 bytes
 

Contents

Class file image Download
<? header('content-type: text/plain'); // 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 = ''; $this->channel = array(); $this->data = ''; $this->stack = array(); $this->num_items = 0; $this->xml_parser = xml_parser_create(); xml_set_element_handler($this->xml_parser, "rss_start_element", "rss_end_element"); xml_set_character_data_handler($this->xml_parser, "rss_character_data"); } 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 'ITEM': array_push($this->stack, $name); array_push($this->stack, $this->num_items); // push item index. $this->item[$this->num_items] = array(); $this->num_items++; 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. $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); ?>