2011-10-04 33 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