Pull to refresh

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

Reading time 3 min
Views 8.3K
Была у меня идея, написать статью, о том, как можно создать свой 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 класса следующиее:
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

Tags:
Hubs:
+32
Comments 35
Comments Comments 35

Articles