На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> Работа с Rss каналами новостей
    Иногда приходится работать с Rss каналами. Вот как осуществляется работа:
    1. Кидаем на форму ListBox и Label.
    2. Создаем три класса: RssChannel, RssItem, RssFeed.
    RssChannel
    ExpandedWrap disabled
      using System;
          using System.Collections.Generic;
          using System.Xml;


    ExpandedWrap disabled
      public class RssChannel
          {
              private readonly string title;
              private readonly string link;
              private List<RssItem> items;
       
              public string Title { get { return title; } }
              public string Link { get { return link; } }
              public IList<RssItem> Items { get { return items.AsReadOnly(); } }
       
              internal RssChannel(XmlNode channelNode)
              {
                  items = new List<RssItem>();
                  title = channelNode.SelectSingleNode("title").InnerText;
                  link = channelNode.SelectSingleNode("link").InnerText;
       
                  XmlNodeList itemNodes = channelNode.SelectNodes("item");
                  foreach (XmlNode itemNode in itemNodes)
                  {
                      items.Add(new RssItem(itemNode));
                  }
              }
          }


    RssItem
    ExpandedWrap disabled
      using System;
          using System.Xml;


    ExpandedWrap disabled
      public class RssItem
          {
              private readonly string title;
              private readonly string description;
              private readonly string link;
       
              public string Title { get { return title; } }
              public string Description { get { return description; } }
              public string Link { get { return link; } }
       
              internal RssItem(XmlNode itemNode)
              {
                  XmlNode selected;
                  selected = itemNode.SelectSingleNode("title");
                  if (selected != null)
                      title = selected.InnerText;
       
                  selected = itemNode.SelectSingleNode("description");
                  if (selected != null)
                      description = selected.InnerText;
       
                  selected = itemNode.SelectSingleNode("link");
                  if (selected != null)
                      link = selected.InnerText;
              }
          }


    RssFeed
    ExpandedWrap disabled
      using System;
          using System.Collections.Generic;
          using System.IO;
          using System.Net;
          using System.Xml;


    ExpandedWrap disabled
      public class RssFeed
          {
              private List<RssChannel> channels;
              public IList<RssChannel> Channels { get { return channels.AsReadOnly(); } }
       
              private RssFeed(XmlNode xmlNode)
              {
                  channels = new List<RssChannel>();
       
                  XmlNode rssNode = xmlNode.SelectSingleNode("rss");
       
                  XmlNodeList channelNodes = rssNode.ChildNodes;
                  foreach (XmlNode channelNode in channelNodes)
                  {
                      RssChannel newChannel = new RssChannel(channelNode);
                      channels.Add(newChannel);
                  }
              }
       
              public static RssFeed FromUri(string uri)
              {
                  XmlDocument xmlDoc;
                  WebClient webClient = new WebClient();
                  using (Stream rssStream = webClient.OpenRead(uri))
                  {
                      TextReader textReader = new StreamReader(rssStream);
                      XmlTextReader reader = new XmlTextReader(textReader);
                      xmlDoc = new XmlDocument();
                      xmlDoc.Load(reader);
                  }
                  return new RssFeed(xmlDoc);
              }
          }

    3. В коде формы пишем
    ExpandedWrap disabled
      private RssFeed rssFeed;
              private void LoadRssFeed()
              {
                  try
                  {
                      rssFeed = RssFeed.FromUri(textBoxUri.Text);
                      InitializeRssView();
                  }
                  catch { }
              }
       
              private void InitializeRssView()
              {
                  foreach (RssItem rssItem in rssFeed.Channels[0].Items)
                  {
                      this.listBox.Items.Add(rssItem.Title);
                  }
              }


    Код конструктора формы:
    ExpandedWrap disabled
      InitializeComponent()
              LoadRssFeed();


    При выделениии строки в ListBox заполняем Label.
    ExpandedWrap disabled
      label.Text = "";
          label.Text = rssFeed.Channels[0].Items[listBox.SelectedIndex].Description;
    Сообщение отредактировано: Yoh -

    Прикреплённый файлПрикреплённый файлNewsReader.zip (41.9 Кбайт, скачиваний: 246)
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0448 ]   [ 15 queries used ]   [ Generated: 18.04.24, 16:37 GMT ]