package.xml100644 1750 1750 12600 100644 6274 XML_RSS pear.php.net RSS parser Parser for Resource Description Framework (RDF) Site Summary (RSS) documents. Clay Loveless clay clay@killersoft.com no Martin Jansen MJ mj@php.net no 2011-05-01 1.0.2 1.0.0 stable stable PHP License Bug #17315: categories are pasted together 4.4.0 1.4.0 XML_Parser pear.php.net 1.0.1 1.0.1 0.9 0.9 stable stable 2002-01-11 PHP License This is the inital stable release. 0.9.1 0.9.1 stable stable 2002-04-11 PHP License This release fixes a small bug that caused warnings when using a verbose error mode in PHP. 0.9.2 0.9.2 stable stable 2003-03-13 PHP License * Added support for the RSS modules Dublin Core Metadata and blogChannel * Big parts of the parsing engine have been rewritten 0.9.9 0.9.9 beta beta 2005-10-22 PHP License This release is a beta release in preparation for the upcoming stable release of version 1.0.0. * Allows string inputs (useful for cached feeds, e.g. from databases) * Fixes dependency on XML_Parser and removes erroneous dependency on XML_Tree * Fixed bug #557 * Fixed bug #2045 * Fixed bug #2310 * Fixed bug #2782 * Fixed bug #3871 * Added unit tests 0.9.10 0.9.10 beta beta 2006-09-14 PHP License This release is a beta release in preparation for the upcoming stable release of version 1.0.0. * Fixed bug #8492 * Added additional unit tests * Added preliminary support for Trackback, GeoCoding, Media and iTunes RSS extensions 1.0.0 1.0.0 stable stable 2010-02-14 PHP License QA release: - Fix bug #11815: XML_Parser must be installed manually [doconnor] - Fix bug #15268: tiny bug, not critical, a typo in RSS.php [doconnor] - Fix bug #17007: Wrong PHP license version [cweiske] - Port unit tests to phpunit 3 - Fix Coding Standards - Convert to package.xml v2 - Stabilize after 4 years in beta 1.0.1 1.0.0 stable stable 2010-10-25 PHP License Automatically built QA release Req #10404 Please add a timestamp in item array - cweiske XML_RSS-1.0.2/tests/test.rss100755 1750 1750 2366 100755 10652 Test http://pear.php.net/ This is a test channel for XML_RSS PEAR http://pear.php.net/gifs/pearsmall.gif http://pear.php.net/ PHP homepage http://php.net/ PEAR homepage http://pear.php.net/ PHP-GTK homepage http://gtk.php.net/ PHP QA homepage http://qa.php.net/ Search Slashdot Search Slashdot stories query http://slashdot.org/search.pl XML_RSS-1.0.2/tests/AllTests.php100755 1750 1750 1267 100755 11405 addTestSuite('XML_RSS_Parsing_Test'); $suite->addTestSuite('XML_RSS_Infrastructure_Test'); return $suite; } } if (PHPUnit_MAIN_METHOD == 'AllTests::main') { AllTests::main(); } // vim:set noet ts=4 sw=4: XML_RSS-1.0.2/tests/XML_RSS_Infrastructure_Test.php100755 1750 1750 4741 100755 15140 * @extends PHPUnit_TestCase * @version $Id: XML_RSS_Infrastructure_Test.php 295062 2010-02-14 14:43:35Z cweiske $ */ class XML_RSS_Infrastructure_Test extends PHPUnit_Framework_TestCase { public static function main() { require_once 'PHPUnit/TextUI/TestRunner.php'; PHPUnit_TextUI_TestRunner::run( new PHPUnit_Framework_TestSuite('XML_RSS_Infrastructure_Test') ); } /** * Test case for making sure that XML_RSS extends from XML_Parser */ function testIsXML_Parser() { $rss =& new XML_RSS(); $this->assertTrue(is_a($rss, "XML_Parser")); } /** * Test case for bug report #2310 * * @link http://pear.php.net/bugs/2310/ */ function testBug2310() { $rss =& new XML_RSS("", null, "utf-8"); $this->assertEquals($rss->tgtenc, "utf-8"); $rss =& new XML_RSS("", "utf-8", "iso-8859-1"); $this->assertEquals($rss->srcenc, "utf-8"); $this->assertEquals($rss->tgtenc, "iso-8859-1"); } } if (PHPUnit_MAIN_METHOD == 'XML_RSS_Infrastructure_Test::main') { XML_RSS_Infrastructure_Test::main(); } ?>XML_RSS-1.0.2/tests/XML_RSS_Parsing_Test.php100755 1750 1750 16154 100755 13544 * @extends PHPUnit_TestCase * @version $Id: XML_RSS_Parsing_Test.php 310689 2011-05-01 17:54:48Z kguest $ */ class XML_RSS_Parsing_Test extends PHPUnit_Framework_TestCase { public static function main() { require_once 'PHPUnit/TextUI/TestRunner.php'; PHPUnit_TextUI_TestRunner::run( new PHPUnit_Framework_TestSuite('XML_RSS_Parsing_Test') ); } function testParseLocalFile() { $result = array("PHP homepage" => "http://php.net/", "PEAR homepage" => "http://pear.php.net/", "PHP-GTK homepage" => "http://gtk.php.net/", "PHP QA homepage" => "http://qa.php.net/"); $values = array_values($result); $keys = array_keys($result); $i = 0; $r =& new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $this->assertEquals(count($r->getItems()), 4); foreach ($r->getItems() as $value) { $this->assertEquals($value['title'], $keys[$i]); $this->assertEquals($value['link'], $values[$i]); $i++; } } function testGetStructure() { $r =& new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $expected = 'a:7:{i:0;a:4:{s:4:"type";s:7:"channel";s:5:"title";s:4:"Test";s:4:"link";s:20:"http://pear.php.net/";s:11:"description";s:34:"This is a test channel for XML_RSS";}i:1;a:4:{s:4:"type";s:5:"image";s:5:"title";s:4:"PEAR";s:3:"url";s:38:"http://pear.php.net/gifs/pearsmall.gif";s:4:"link";s:20:"http://pear.php.net/";}i:2;a:4:{s:4:"type";s:4:"item";s:5:"title";s:12:"PHP homepage";s:4:"link";s:15:"http://php.net/";s:8:"category";a:1:{i:0;s:3:"php";}}i:3;a:4:{s:4:"type";s:4:"item";s:5:"title";s:13:"PEAR homepage";s:4:"link";s:20:"http://pear.php.net/";s:8:"category";a:2:{i:0;s:3:"php";i:1;s:4:"pear";}}i:4;a:4:{s:4:"type";s:4:"item";s:5:"title";s:16:"PHP-GTK homepage";s:4:"link";s:19:"http://gtk.php.net/";s:8:"category";a:2:{i:0;s:3:"php";i:1;s:3:"gtk";}}i:5;a:4:{s:4:"type";s:4:"item";s:5:"title";s:15:"PHP QA homepage";s:4:"link";s:18:"http://qa.php.net/";s:8:"category";a:2:{i:0;s:3:"php";i:1;s:2:"qa";}}i:6;a:5:{s:4:"type";s:9:"textinput";s:5:"title";s:15:"Search Slashdot";s:11:"description";s:23:"Search Slashdot stories";s:4:"name";s:5:"query";s:4:"link";s:29:"http://slashdot.org/search.pl";}}'; $actual = serialize($r->getStructure()); $this->assertEquals($expected, $actual); } function testGetStructureFromString() { $rss = file_get_contents(dirname(__FILE__) . '/test.rss'); $r =& new XML_RSS($rss); $r->parse(); $expected = 'a:7:{i:0;a:4:{s:4:"type";s:7:"channel";s:5:"title";s:4:"Test";s:4:"link";s:20:"http://pear.php.net/";s:11:"description";s:34:"This is a test channel for XML_RSS";}i:1;a:4:{s:4:"type";s:5:"image";s:5:"title";s:4:"PEAR";s:3:"url";s:38:"http://pear.php.net/gifs/pearsmall.gif";s:4:"link";s:20:"http://pear.php.net/";}i:2;a:4:{s:4:"type";s:4:"item";s:5:"title";s:12:"PHP homepage";s:4:"link";s:15:"http://php.net/";s:8:"category";a:1:{i:0;s:3:"php";}}i:3;a:4:{s:4:"type";s:4:"item";s:5:"title";s:13:"PEAR homepage";s:4:"link";s:20:"http://pear.php.net/";s:8:"category";a:2:{i:0;s:3:"php";i:1;s:4:"pear";}}i:4;a:4:{s:4:"type";s:4:"item";s:5:"title";s:16:"PHP-GTK homepage";s:4:"link";s:19:"http://gtk.php.net/";s:8:"category";a:2:{i:0;s:3:"php";i:1;s:3:"gtk";}}i:5;a:4:{s:4:"type";s:4:"item";s:5:"title";s:15:"PHP QA homepage";s:4:"link";s:18:"http://qa.php.net/";s:8:"category";a:2:{i:0;s:3:"php";i:1;s:2:"qa";}}i:6;a:5:{s:4:"type";s:9:"textinput";s:5:"title";s:15:"Search Slashdot";s:11:"description";s:23:"Search Slashdot stories";s:4:"name";s:5:"query";s:4:"link";s:29:"http://slashdot.org/search.pl";}}'; $actual = serialize($r->getStructure()); $this->assertEquals($expected, $actual); } function testGetChannelInfo() { $r =& new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $expected = array( 'title' => 'Test', 'link' => 'http://pear.php.net/', 'description' => 'This is a test channel for XML_RSS' ); $actual = $r->getChannelInfo(); $this->assertEquals($expected, $actual); } function testGetItems() { $r =& new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $expected = array(); $expected[] = array( 'title' => 'PHP homepage', 'link' => 'http://php.net/', 'category' => array('php') ); $expected[] = array( 'title' => 'PEAR homepage', 'link' => 'http://pear.php.net/', 'category' => array('php', 'pear') ); $expected[] = array( 'title' => 'PHP-GTK homepage', 'link' => 'http://gtk.php.net/', 'category' => array('php', 'gtk') ); $expected[] = array( 'title' => 'PHP QA homepage', 'link' => 'http://qa.php.net/', 'category' => array('php', 'qa') ); $actual = $r->getItems(); $this->assertEquals($expected, $actual); } function testGetImages() { $r =& new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $expected = array(); $expected[] = array( 'title' => 'PEAR', 'url' => 'http://pear.php.net/gifs/pearsmall.gif', 'link' => 'http://pear.php.net/' ); $actual = $r->getImages(); $this->assertEquals($expected, $actual); } function testGetTextinputs() { $r =& new XML_RSS(dirname(__FILE__) . '/test.rss'); $r->parse(); $expected = array( 'title' => 'Search Slashdot', 'description' => 'Search Slashdot stories', 'name' => 'query', 'link' => 'http://slashdot.org/search.pl' ); $actual = $r->getTextinputs(); $this->assertEquals($expected, $actual); } } if (PHPUnit_MAIN_METHOD == 'XML_RSS_Parsing_Test::main') { XML_RSS_Parsing_Test::main(); } ?> XML_RSS-1.0.2/XML/RSS.php100755 1750 1750 24331 100755 7634 * @license PHP License http://php.net/license * @version SVN: $Id: RSS.php 310689 2011-05-01 17:54:48Z kguest $ * @link http://pear.php.net/package/XML_RSS */ require_once 'XML/Parser.php'; /** * RSS parser class. * * This class is a parser for Resource Description Framework (RDF) Site * Summary (RSS) documents. For more information on RSS see the * website of the RSS working group (http://www.purl.org/rss/). * * @category XML * @package XML_RSS * @author Martin Jansen * @license PHP License http://php.net/license * @link http://pear.php.net/package/XML_RSS */ class XML_RSS extends XML_Parser { // {{{ properties /** * @var string */ var $insideTag = ''; /** * @var array */ var $insideTagStack = array(); /** * @var string */ var $activeTag = ''; /** * @var array */ var $channel = array(); /** * @var array */ var $items = array(); /** * @var array */ var $item = array(); /** * @var array */ var $image = array(); /** * @var array */ var $textinput = array(); /** * @var array */ var $textinputs = array(); /** * @var array */ var $attribs; /** * @var array */ var $parentTags = array('CHANNEL', 'ITEM', 'IMAGE', 'TEXTINPUT'); /** * @var array */ var $channelTags = array( 'TITLE', 'LINK', 'DESCRIPTION', 'IMAGE', 'ITEMS', 'TEXTINPUT', 'LANGUAGE', 'COPYRIGHT', 'MANAGINGEditor', 'WEBMASTER', 'PUBDATE', 'LASTBUILDDATE', 'CATEGORY', 'GENERATOR', 'DOCS', 'CLOUD', 'TTL', 'RATING' ); /** * @var array */ var $itemTags = array( 'TITLE', 'LINK', 'DESCRIPTION', 'PUBDATE', 'AUTHOR', 'CATEGORY', 'COMMENTS', 'ENCLOSURE', 'GUID', 'SOURCE', 'CONTENT:ENCODED' ); /** * @var array */ var $imageTags = array('TITLE', 'URL', 'LINK', 'WIDTH', 'HEIGHT'); var $textinputTags = array('TITLE', 'DESCRIPTION', 'NAME', 'LINK'); /** * List of allowed module tags * * Currently supported: * * Dublin Core Metadata * blogChannel RSS module * CreativeCommons * Content * Syndication * Trackback * GeoCoding * Media * iTunes * * @var array */ var $moduleTags = array( 'DC:TITLE', 'DC:CREATOR', 'DC:SUBJECT', 'DC:DESCRIPTION', 'DC:PUBLISHER', 'DC:CONTRIBUTOR', 'DC:DATE', 'DC:TYPE', 'DC:FORMAT', 'DC:IDENTIFIER', 'DC:SOURCE', 'DC:LANGUAGE', 'DC:RELATION', 'DC:COVERAGE', 'DC:RIGHTS', 'BLOGCHANNEL:BLOGROLL', 'BLOGCHANNEL:MYSUBSCRIPTIONS', 'BLOGCHANNEL:BLINK', 'BLOGCHANNEL:CHANGES', 'CREATIVECOMMONS:LICENSE', 'CC:LICENSE', 'CONTENT:ENCODED', 'SY:UPDATEPERIOD', 'SY:UPDATEFREQUENCY', 'SY:UPDATEBASE', 'TRACKBACK:PING', 'GEO:LAT', 'GEO:LONG', 'MEDIA:GROUP', 'MEDIA:CONTENT', 'MEDIA:ADULT', 'MEDIA:RATING', 'MEDIA:TITLE', 'MEDIA:DESCRIPTION', 'MEDIA:KEYWORDS', 'MEDIA:THUMBNAIL', 'MEDIA:CATEGORY', 'MEDIA:HASH', 'MEDIA:PLAYER', 'MEDIA:CREDIT', 'MEDIA:COPYRIGHT', 'MEDIA:TEXT', 'MEDIA:RESTRICTION', 'ITUNES:AUTHOR', 'ITUNES:BLOCK', 'ITUNES:CATEGORY', 'ITUNES:DURATION', 'ITUNES:EXPLICIT', 'ITUNES:IMAGE', 'ITUNES:KEYWORDS', 'ITUNES:NEW-FEED-URL', 'ITUNES:OWNER', 'ITUNES:PUBDATE', 'ITUNES:SUBTITLE', 'ITUNES:SUMMARY' ); /** * @var array */ var $last = array(); // }}} // {{{ Constructor /** * Constructor * * @param mixed $handle File pointer, name of the RSS file, or an RSS string. * @param string $srcenc Source charset encoding, use null (default) * to use default encoding (ISO-8859-1) * @param string $tgtenc Target charset encoding, use null (default) * to use default encoding (ISO-8859-1) * * @return void * @access public */ function XML_RSS($handle = '', $srcenc = null, $tgtenc = null) { if ($srcenc === null && $tgtenc === null) { $this->XML_Parser(); } else { $this->XML_Parser($srcenc, 'event', $tgtenc); } $this->setInput($handle); if ($handle == '') { $this->raiseError('No input passed.'); } } // }}} // {{{ startHandler() /** * Start element handler for XML parser * * @param object $parser XML parser object * @param string $element XML element * @param array $attribs Attributes of XML tag * * @return void * @access private */ function startHandler($parser, $element, $attribs) { if (substr($element, 0, 4) == "RSS:") { $element = substr($element, 4); } switch ($element) { case 'CHANNEL': case 'ITEM': case 'IMAGE': case 'TEXTINPUT': $this->insideTag = $element; array_push($this->insideTagStack, $element); break; case 'ENCLOSURE' : $this->attribs = $attribs; break; default: $this->activeTag = $element; } } // }}} // {{{ endHandler() /** * End element handler for XML parser * * If the end of , , or * is reached, this method updates the structure array * $this->struct[] and adds the field "type" to this array, * that defines the type of the current field. * * @param object $parser XML parser object * @param string $element Name of element that ends * * @return void * @access private */ function endHandler($parser, $element) { if (substr($element, 0, 4) == "RSS:") { $element = substr($element, 4); } if ($element == $this->insideTag) { array_pop($this->insideTagStack); $this->insideTag = end($this->insideTagStack); $this->struct[] = array_merge( array('type' => strtolower($element)), $this->last ); } if ($element == 'ITEM') { $this->items[] = $this->item; $this->item = ''; } if ($element == 'IMAGE') { $this->images[] = $this->image; $this->image = ''; } if ($element == 'TEXTINPUT') { $this->textinputs = $this->textinput; $this->textinput = ''; } if ($element == 'ENCLOSURE') { if (!isset($this->item['enclosures'])) { $this->item['enclosures'] = array(); } $this->item['enclosures'][] = array_change_key_case( $this->attribs, CASE_LOWER ); $this->attribs = array(); } $this->activeTag = ''; } // }}} // {{{ cdataHandler() /** * Handler for character data * * @param object $parser XML parser object * @param string $cdata CDATA * * @return void * @access private */ function cdataHandler($parser, $cdata) { if (in_array($this->insideTag, $this->parentTags)) { $tagName = strtolower($this->insideTag); $var = $this->{$tagName . 'Tags'}; if (in_array($this->activeTag, $var) || in_array($this->activeTag, $this->moduleTags) ) { $this->_add( $tagName, strtolower($this->activeTag), $cdata ); } } } // }}} // {{{ defaultHandler() /** * Default handler for XML parser * * @param object $parser XML parser object * @param string $cdata CDATA * * @return void * @access private */ function defaultHandler($parser, $cdata) { return; } // }}} // {{{ _add() /** * Add element to internal result sets * * @param string $type Name of the result set * @param string $field Fieldname * @param string $value Value * * @return void * @access private * @see cdataHandler */ function _add($type, $field, $value) { if ($field == 'category') { $this->{$type}[$field][] = $value; } else if (empty($this->{$type}) || empty($this->{$type}[$field])) { $this->{$type}[$field] = $value; } else { $this->{$type}[$field] .= $value; } $this->last = $this->{$type}; } // }}} // {{{ getStructure() /** * Get complete structure of RSS file * * @return array * @access public */ function getStructure() { return (array)$this->struct; } // }}} // {{{ getchannelInfo() /** * Get general information about current channel * * This method returns an array containing the information * that has been extracted from the -tag while parsing * the RSS file. * * @return array * @access public */ function getChannelInfo() { return (array)$this->channel; } // }}} // {{{ getItems() /** * Get items from RSS file * * This method returns an array containing the set of items * that are provided by the RSS file. * * @return array * @access public */ function getItems() { return (array)$this->items; } // }}} // {{{ getImages() /** * Get images from RSS file * * This method returns an array containing the set of images * that are provided by the RSS file. * * @return array * @access public */ function getImages() { return (array)$this->images; } // }}} // {{{ getTextinputs() /** * Get text input fields from RSS file * * @return array * @access public */ function getTextinputs() { return (array)$this->textinputs; } // }}} } ?>