使用Zend_Feed_Reader的RSS命名空间

时间:2011-10-04 03:01:18

标签: php zend-framework zend-feed

我在使用Zend_Feed_Reader解析RSS提要时遇到一些问题,特别是在使用RSS命名空间时。

我正在尝试解析的Feed是BBC新闻Feed(http://feeds.bbci.co.uk/news/rss.xml),其中包含以下内容:

<item>
<media:thumbnail width="66" height="49" url="http://news.bbcimg.co.uk/media/images/55800000/jpg/_55800088_013076641-1.jpg"/>
<media:thumbnail width="144" height="81" url="http://news.bbcimg.co.uk/media/images/55807000/jpg/_55807247_013074606-1.jpg"/> 
</item>

我用来解析<item>中其他项目的代码是这样的:

$feed = Zend_Feed_Reader::import('http://feeds.bbci.co.uk/news/rss.xml');
foreach($feed as $item)
{
    echo $item->getTitle();
    echo $item->getDescription();
    // etc
}

但是,使用$item->getMedia()$item->getMedia('thumbnail')$item->{'media:thumbnail'}$item->{'media:thumbnail'}()不起作用。

我也尝试编写自己的扩展程序(使用this as a guide):

class Zend_Feed_Reader_Extension_Media_Entry extends Zend_Feed_Reader_Extension_EntryAbstract
{
    public function getThumbnail()
    {
        if(isset($this->_data['thumbnail']))
            return $this->_data['thumbnail'];

        $thumbnail = $this->_xpath->evaluate(
            'string(' . $this->getXpathPrefix() . '/media:thumbnail)'
        );

        if(!$thumbnail)
            $thumbnail = null;

        $this->_data['thumbnail'] = $thumbnail;

        return $this->_data['thumbnail'];
    }

    protected function _registerNamespaces()
    {
        $this->_xpath->registerNamespace('media', 'http://search.yahoo.com/mrss');
    }
}

然后执行所有适当的扩展注册(Zend_Feed_Reader::registerExtension('media');)在运行$item->getThumbnail()时返回null。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:3)

我也按照Zend.com的指南进行操作,发现第一个代码块存在问题,Zend_Feed_Reader::addPrefixPath的参数顺序不正确,必须如下:< / p>

if(!Zend_Feed_Reader::isRegistered('JungleBooks')) {
    Zend_Feed_Reader::addPrefixPath(
        'My_FeedReader_Extension', '/path/to/My/FeedReader/Extension'
    );
    Zend_Feed_Reader::registerExtension('JungleBooks');
}

我假设您以这种方式注册了您的扩展程序?

完成了,并继续自定义扩展。 使用Zend.com的完整示例只给了我一个空字符串。 尝试了一些不同的符号来获取命名空间,如双冒号::,括号[]甚至@符号,我几乎放弃了。

然后突然出现了一些东西;如果我尝试在没有string()换行的情况下获取XPath,那么我做了什么(我使用了你的代码使它更清晰):

class Zend_Feed_Reader_Extension_Media_Entry 
    extends Zend_Feed_Reader_Extension_EntryAbstract
{
    public function getThumbnails()
    {
        if(isset($this->_data['thumbnails'])){
            return $this->_data['thumbnails'];
        }

        $thumbnail_list = $this->_xpath->evaluate(
            $this->getXpathPrefix() . '/media:thumbnail'
        );
        $thumbnails = array();

        // According to your XML sample there are multiple thumbnails per item, so we're looping through them and adding them to a simple array
        foreach($thumbnail_list as $_thumbnail_element){
            array_push($thumbnails, array(
                'url'    => $_thumbnail_element->getAttribute('url'),
                'width'  => $_thumbnail_element->getAttribute('width'),
                'height' => $_thumbnail_element->getAttribute('height'),
            ));
        }

        if(!count($thumbnails)){
            $thumbnails = null;
        }

        $this->_data['thumbnails'] = $thumbnails;

        return $this->_data['thumbnails'];
    }

    protected function _registerNamespaces()
    {
        $this->_xpath->registerNamespace('media', 'http://search.yahoo.com/mrss');
    }
}

瞧,有你的缩略图。

相关问题