package.xml 100644 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.rss 100755 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.php 100755 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.php 100755 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.php 100755 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.php 100755 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;
}
// }}}
}
?>