У меня возникают проблемы с разбором 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'); } }
И вуаля, есть твои миниатюры.