An RSS parser in PHP for SourceForge feeds
I wrote this for parsing RSS feeds associated with a SourceForge project. It should be reasonably capable for that purpose; though I do not expect it to be generally robust for handling arbitrary feeds. Reed suggested that this might be generally useful; however, I don’t want to put it anywhere that I might feel compelled to maintain it. So this seems like a good spot.
// // Copyright 2008 Braden McDaniel // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 3 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along // with this library; if not, see . // class RSS2Image { var $url = ""; var $title = ""; var $link = ""; var $width = ""; var $height = ""; } class RSS2Item { var $title = ""; var $link = ""; var $description = ""; var $author = ""; var $category = ""; var $comments = ""; var $enclosure = ""; var $guid = ""; var $pub_date = ""; var $source = ""; } class RSS2Channel { var $title; var $link; var $description; var $copyright; var $last_build_date; var $generator; var $image; var $items; function RSS2Channel() { $this->title = ""; $this->link = ""; $this->description = ""; $this->copyright = ""; $this->last_build_date = ""; $this->generator = ""; $this->image = null; $this->items = array(); } } class RSS2Parser { var $parser; var $channel; var $in_channel, $in_image, $in_item; var $current_element; function RSS2Parser() { $this->in_channel = false; $this->in_image = false; $this->in_item = false; $this->parser = xml_parser_create(); xml_set_object($this->parser, $this); xml_set_element_handler($this->parser, "start_element", "end_element"); xml_set_character_data_handler($this->parser, "character_data"); } function parse($data) { xml_parse($this->parser, $data); return $this->channel; } function start_element($parser, $name, $attribs) { $name = strtolower($name); if ($name == "channel") { $this->in_channel = true; $this->channel = new RSS2Channel(); return true; } if ($this->in_channel) { if ($name == "image") { $this->in_image = true; $this->channel->image = new RSS2Image(); return true; } elseif ($name == "item") { $this->in_item = true; $this->channel->items[] = new RSS2Item(); return true; } } if ($this->in_image) { $this->current_element = &$this->channel->image->$name; } elseif ($this->in_item) { $this->current_element = &end($this->channel->items)->$name; } return true; } function end_element($parser, $name) { $name = strtolower($name); if ($name == "channel") { $this->in_channel = false; } elseif ($name == "image") { $this->in_image = false; } elseif ($name == "item") { $this->in_item = false; } unset($this->current_element); return true; } function character_data($parser, $data) { if (isset($this->current_element)) { $this->current_element .= $data; } return true; } }
Syndicated 2008-01-26 20:26:11 (Updated 2008-01-26 20:26:49) from endoframe :: log