RSS Пространства имен с использованием Zend_Feed_Reader

У меня возникают проблемы с разбором RSS-каналов с помощью Zend_Feed_Reader, особенно когда используется пространство имен RSS.

Подача, которую я пытаюсь проанализировать, – это канал новостей BBC (http://feeds.bbci.co.uk/news/rss.xml), который включает следующее:

<item> <media:thumbnail width="66" height="49" url="http://img.ruphp.com/php/_55800088_013076641-1.jpg"/> <media:thumbnail width="144" height="81" url="http://img.ruphp.com/php/_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'}() , не Работа.

Я также попытался написать собственное расширение (используя это как руководство ):

 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'); ) возвращает null при запуске $item->getThumbnail() .

У кого-нибудь есть идеи?

Я также выполнил руководство на 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 просто дало мне пустую строку. Попробовав несколько разных обозначений для доступа к пространству имен, например double colons :: , скобки [] и даже @ символы, я почти сдался.

А потом что-то всплыло в голове; что, если я попытаюсь извлечь свой XPath без обертки string() , и поэтому я сделал (я использовал ваш код, чтобы сделать его еще более понятным):

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

И вуаля, есть твои миниатюры.