Пространства имен RSS с использованием Zend_Feed_Reader - PullRequest
2 голосов
/ 04 октября 2011

У меня возникли некоторые проблемы с анализом 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 Ответ

3 голосов
/ 01 ноября 2011

Я также следовал руководству на 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');
    }
}

И вуаля, есть твои эскизы.

...