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

Основа формы – TableLayoutPanel, с параметром заполняющий форму, и уже на нем расположены TextBox, Button, ListView (для вывода списка новостей) и WebBrowser (для отображения содержимого). Далее добавляем в References сборку «System.ServiceModel.Web», и добавляем в секцию using класса следующиее:
Итак, начнем
Для начала создадим новый проект – обычное Windows приложение. С простейшим интерфейсом, например таким:
Основа формы – TableLayoutPanel, с параметром заполняющий форму, и уже на нем расположены 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 фиды.
Да, кстати, данный пример написан для демонстрации удобства и простоты использования Syndication. Так как свою статью о том, как писать Rss-ридер без него, я еще не дописал, то вот вам, для сравнения, ссылка на другую статью по той же теме: Работа с RSS в C# (Csharp). Создание своего RSSReader.
UPD:
Ссылка для скачивания исходников: RssReader.rar