Snippet Name: Parse RSS into array
Description: Parses RSS into an array. Quick, simple, and nasty but it does the job.
Also see: » Pre-populated List of Countries
» Array of all US states
» Search array elements for a substring
» Create a drop down menu from an array ...
» Unset unkown array element
» Parse RSS into array
» Quickly sort associative arrays
» Recursively traverse array
» Combining three arrays into one
» Combining two arrays into one
» Check if array is associative
» Unique Array function
» Pick Randomly from Array
» HEX to RGB array
» Filter Empty Array Elements
Comment: (none)
Language: PHP
Highlight Mode: PHP
Last Modified: March 16th, 2009
|
<?PHP
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.
// 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.
?>
|