Пространства имен 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://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'}()
не работает
Я также попытался написать свое собственное расширение (используя это как руководство):
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()
,
У кого-нибудь есть какие-либо идеи?
1 ответ
Я также следовал руководству на 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 просто дало мне пустую строку. Попробовав несколько разных обозначений для доступа к пространству имен, как двойные двоеточия ::
, скобки []
и даже @
символы я почти сдался.
А потом что-то всплыло в голове; Что делать, если я пытаюсь получить свой 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');
}
}
И вуаля, есть ваши эскизы.