12.4. Работа с лентой RSS

Чтение ленты такое же простое, как создание объекта Zend_Feed_Rss с URI ленты:

<?php

$channel = new Zend_Feed_Rss('http://rss.example.com/channelName');

?>

Если при извлечении ленты произошла ошибка, то будет сгенерировано исключение Zend_Feed_Exception.

Создав объект ленты, вы можете получить доступ к любым стандартным свойствам канала RSS (channel) непосредственно в объекте.

<?php

echo $channel->title();

?>

Обратите внимание на синтаксис функции. Zend_Feed использует соглашение об интерпретации свойств как объекта XML, если они запрошены в синтаксисе получения переменной ($obj->property и как строки, если они запрошены в синтаксисе метода ($obj->property()). Это позволяет получить доступ к полному тексту любого отдельного узла, что одновременно дает полный доступ и ко всем дочерним элементам.

Если свойства канала имеют атрибуты, то к ним можно получить доступ, используя синтаксис массива PHP:

<?php

echo $channel->category['domain'];

?>

Поскольку атрибуты не могут иметь дочерние записи, то нет необходимости в синтаксисе метода для получения значений атрибутов.

Весьма возможно, что вы хотите произвести обход ленты и произвести какие-либо операции с ее публикациями. Zend_Feed_Abstract реализует интерфейс PHP Iterator, поэтому вывод заголовков всех статей в канале будет выглядеть следующим образом:

<?php

foreach ($channel as $item) {
    echo $item->title() . "\n";
}

?>

Если вы не знакомы с RSS, то здесь приведены стандартные элементы, которые должны присутствовать в канале (элемент <channel>) и отдельных публикациях (элемент <item>) RSS.

Обязательные элементы канала:

Обычно используемые необязательные элементы канала:

Элементы <item> не имеют обязательных вложенных элементов. Тем не менее, должны быть представлены <title> (заголовок) или <description> (описание).

Обычно используемые элементы публикации

В своем коде вы можете проверить, имеет ли элемент непустое значение, следующим образом:

<?php

if ($item->propname()) {
    // ... продолжение работы
}

?>

Если вместо этого использовать $item->propname, то всегда будете получать объект, который расценивается как TRUE, поэтому такая проверка будет ошибочной.

За дополнительной информацией см. официальное описание спецификации RSS 2.0: http://blogs.law.harvard.edu/tech/rss