Была у меня идея, написать статью, о том, как можно создать свой 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