Простой Feed-ридер за 10 минут

15 Июн
2008

Была у меня идея, написать статью, о том, как можно создать свой RSS-ридер. Я даже начал ее реализовывать, но сегодня на хабре появилась статья Maxter’a — Генерация RSS фидов с помощью класса Syndication. В этой статье рассматривался набор классов Syndication, для с фидами (Feeds) RSS и Atom. Благодаря Syndication можно не только генерировать фиды, но и читать их. В этой статье я хочу представить простейший пример RSS/Atom ридера, который можно написать буквально за 10 минут. Правда, доступна эта возможность только в .Net Framework 3.5…

Итак, начнем

Для начала создадим новый проект – обычное Windows приложение. С простейшим интерфейсом, например таким:

Основа формы – TableLayoutPanel, с параметром Dock равным Fill, и уже на нем расположены TextBox, Button, ListView (для вывода списка новостей) и WebBrowser (для отображения содержимого). Далее добавляем в References сборку «System.ServiceModel.Web», и добавляем в секцию using класса следующиее:

using System.ServiceModel.Syndication;
using System.Xml;

Что касается кода, то он простейший. Вот код обработки нажатия на кнопку «Обновить»:

private void btRefresh_Click(object sender, EventArgs e)
{
// Проверяем задан ли адрес
if (!String.IsNullOrEmpty(tbUrl.Text))
{
// Очищаем ListView перед добавлением новых данных
lvNews.Clear();
// Создаем XmlReader дял чтения RSS/Atom
XmlReader FeedReader = XmlReader.Create(tbUrl.Text);
// Загружаем RSS/Atom
SyndicationFeed Channel = SyndicationFeed.Load(FeedReader);

// если загрузились
if (Channel != null)
{
// обрабатываем каждую новость канала
foreach (SyndicationItem RSI in Channel.Items)
{
// создаем элемент для вывода в ListView
ListViewItem LVI = new ListViewItem(RSI.Title.Text);
LVI.Name = RSI.Title.Text;
// связываем ListViewItem и новость
LVI.Tag = RSI;
// добавляем новость в ListView
lvNews.Items.Add(LVI);
}
}
}
}

Теперь добавляем обработчик события MouseDown для ListView:

private void lvNews_MouseDown(object sender, MouseEventArgs e)
{
//если нажата левая кнопка мыши, то
if (e.Button == MouseButtons.Left)
{
// получаем ListViewItem, который находится под курсором
ListViewItem item = lvNews.GetItemAt(e.X, e.Y);

// если курс не на пустом месте, то
if (item != null)
{
// получаем связаную с выбраным ListViewItem новость
SyndicationItem RSI = (SyndicationItem)item.Tag;

// выводим полный текст новости
if (RSI.Content!=null) // значит Atom
wbDescription.DocumentText = ((TextSyndicationContent)RSI.Content).Text;
else // иначе RSS
wbDescription.DocumentText = RSI.Summary.Text;
}
}
}

Вот и все. Простейший feed-ридер готов. Он может читать как RSS так и
Atom фиды.

А вот и обещаные исходники: RssReader.rar

2leep.com

2 комментария к записи Простой Feed-ридер за 10 минут

Avatar

rame0

14th Июнь 2008 в 22:48

>«Параметр Dock равный Fill» это конечно круто, >но без какого-либо механизма кеширования >программку с трудом можно назвать даже >адекватным примером rss-reader’a.

Само собой, но целью не ставилось написать програмку, которая хранит историю и прочее. Для обозрения этого, я хотел написать несколько статей, сначала сам ридер, потом как можно организовать хранение истории, и в финале хотел прикрутить красивый WPF интерфейс. Но пока писал первую статью, на хабре напоролся на упомянутый пост, и решил опробовать Syndication для чтения. Получилось. Так что первая статья цикла переписалась, как то сама собой, в течении часа. 🙂 Скоро опишу, как я кешировал прочитанное.

С WCF я знаком немного… Очень удобная штука. Сама генерит WSDL, потом, специальной утилитой или же обновлением в студии (если код еще только пишется), генерит проксю к этому виздлу 🙂 И все. Можно юзать.

Про REST я, если честно не слышал… Надо будет как инбудь осведомиться по этой теме 🙂

Avatar

rame0

14th Июнь 2008 в 23:01

Да, так, для примера, вот статься, в которой описано создание такого же RSS ридера, даже помоему еще менее функцианального. Сравни размеры, как статьи, так и кода 🙂

https://www.rame0.ru/redir/CkFMFl4YTk5OTh8WVQRaVVlcD1oDGl1QFx9SQUZcB1QHGk4PAUBODQ8NCA==/

Оставить комментарий или два

*

Наверх