Для обработки RSS/Atom лент удобно использовать perl модуль XML::Feed, у
которого есть один неприятный недостаток - необходимость установки очень
большого числа зависимостей. Для работы XML::Feed во FreeBSD нужно установить
около 100 дополнительных Perl модулей, не входящих в состав Perl 5.8.
В качестве альтернативы с похожим синтаксимои и минимальным числом зависимостей
можно предложить модуль XML::FeedPP (http://search.cpan.org/dist/XML-FeedPP/),
в зависимостях у которого значится только XML::TreePP
(http://search.cpan.org/dist/XML-TreePP/). Отрицательной чертой XML::FeedPP
является невысокая производительность, так как модуль целиком написан на Perl,
без привлечения библиотек подобных expat и libxml.
Простой пример парсинга RSS, RDF или Atom ленты:
#!/usr/bin/perl
use strict;
use XML::FeedPP;
my $feed = XML::FeedPP->new( './test.xml'); # Вместо файла можно указать URL
print "Заголовок ленты: ", $feed->title(), "\n";
print "Дата: ", $feed->pubDate(), "\n";
# Выводим список новостей, отраженных в ленте
foreach my $item ( $feed->get_item() ) {
print "URL: " . $item->link() . "\n";
print "Title: " . $item->title() . "\n";
}
Кроме $item->link() и $item->title(), у объекта $item имеются следующие методы:
$item->description(), $item->pubDate(), $item->category(), $item->author(),
$item->guid(), $item->get( произвольное_имя_параметра).
Для преобразования нескольких Atom и RSS в один RSS можно использовать:
# создаем пустой RSS файл
my $feed = XML::FeedPP::RSS->new();
# присоединяем локальный atom файл
$feed->merge("atom.xml");
# присоединяем удаленный RSS
$feed->merge( "http://www.test.com/rss.xml" );
# меняем время модификации.
my $now = time();
$feed->pubDate( $now );
# меняем название ленты
$feed->title( "Sumary news" );
# добавляем в ленту свой элемент (заголовок Test, ссылка http://test.com/news/1, id 12345)
my $item = $feed->add_item( "http://test.com/news/1" );
$item->title( "test" );
$item->pubDate( "2009-02-23T14:43:43+09:00" );
$item->guid(12345);
# сохраняем в строку $rss_str готовую RSS ленту
my $rss_str = $feed->to_string();
# или сохраняем в файл
$feed->to_file( "index.rss" );
|