PHP Classes
elePHPant
Icontem

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: 19 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);
?>