2011-10-04 28 views
2

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

我试图解析饲料是BBC新闻饲料(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()时返回空。

有没有人有任何想法?

回答

3

我也没有跟着导游在Zend.com,发现存在与第一个代码块中的问题,为Zend_Feed_Reader::addPrefixPath参数是不正确的秩序,必须是这样的:

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'); 
    } 
} 

瞧,还有你的缩略图。

+0

谢谢,太好了!非常感谢您的帮助。 – catkin