Справочник по C#

    Исходники по языку программирования CSharp

    Работа с RSS в C# (Csharp): Справочник по C#

    /
    /
    /
    343 Views


          Уже несколько лет очень популярной технологией является RSS. Почти на каждом сайте в интернете вы можете встретить RSS-ленты, в которых содержатся новости сайта, статьи, различные сообщения, и т.д. RSS(Really Simple Syndication) – это формат передачи веб-контента. Расшифровывается как «по-настоящему простая передача информации». Данная технология представляет собой диалект XML. Все файлы RSS обязаны соответствовать спецификации XML 1.0 и содержать основные элементы, которыми являются «channel», «item», «title», «description», «link», «pubDate».
          Первый элемент «Channel», содержит заголовок, ссылку на официальный сайт, описание канала и т.д. Второй элемент «item», представляет собой список статей/новостей/записей, а так же свойства этих записей: заголовок, ссылка, описание, дата публикации. На самом деле свойств, как канала, так и записи может быть гораздо больше. Все они приведены в спецификации rss 2.0.
          В качестве примера рассмотрим приложение для чтения RSS ленты с нашего сайта, которая находится по адресу «http://feeds.feedburner.com/csharpcoderr?format=xml».

          Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте приведенный ниже список элементов управления:

    • label1 – представляет элемент управления для описания текстового поля (textBox1);
    • textBox1 – представляет элемент управления для ввода URL адреса RSS – потока;
    • button1 – представляет элемент управления для запуска процесса загрузки и синтаксического анализа полученной информации из RSS – потока;
    • splitContainer1 – представляет элемент управления, который может рассматриваться как составной; это две панели, разделенные подвижной вертикальной перегородкой. При наведении указателя мыши на перегородку, форма курсора изменяется, чтобы показать, что она является перемещаемой. Данный элемент необходим для разделения центральной части формы на две половины. В первой будет располагаться элемент управления «listBox1», а во второй «webBrowser1». Данное разделение необходимо для удобства представления полученной информации;
    • listBox1 – представляет элемент управления для вывода списка заголовков загруженных сообщений;
    • webBrowser1 – представляет элемент управления для вывода сформированной html страницы, содержащей загруженные сообщения;
    • label2 – представляет элемент управления для вывода информации о количестве загруженных сообщений.

    У вас получится приведенный ниже пример:

          Согласно спецификации «rss 2.0», все элементы RSS – потока являются необязательными, поэтому анализ будет ограничен элементами «channel», «item» и «img». Хранение полученной информации будет реализовано в виде классов. Класс, отвечающий за настройки канала «channel» представлен ниже. Данный класс содержит в себе четыре поля, «title» (название канала), «description» (Описание канала), «link» (ссылка) и «copyright» (копирайт (является необязательным)).

    // Класс отвечающий за настройки канала.
    public class ChannelClass
    {
    //Заголовок сайта - источника.
    public string title;
    
    //Описание сайта - источника.
    public string description;
    
    //Ссылка на сайт источника.
    public string link;
    
    // копирайт.
    public string copyright;
    
    public ChannelClass()
    {
    title = "";
    description = "";
    link = "";
    copyright = "";
    }
    }

          Следующим класс предоставляет информацию о записи и будет хранить такую минимальную информацию как: «title (заголовок)»«link» (ссылка на полный текст), «description» (краткий обзор сообщения) и «pubDate» (дата публикации сообщения).

    // Класс сообщений.
    public class Items
    {
    //Заголовок сообщения.
    public string title;
    //Ссылка на страницу сообщения в интернете.
    public string link;
    //Краткий обзор сообщения.
    public string description;
    //Дата публикации сообщения.
    public string pubDate;
    
    public Items()
    {
    title = "";
    link = "";
    description = "";
    pubDate = "";
    }
    }

          Так как в сообщениях могут присутствовать изображения, для них тоже необходимо создать отдельный класс. Здесь будет храниться информация о заголовке изображения, ссылки на него и URL адрес.

    // Класс рисунка канала.
    public class ImageOfChanel
    {
    //Заголовок изображения.
    public string imgTitle;
    
    //Ссылка на изображение.
    public string imgLink;
    
    //URL адрес сообщения.
    public string imgURL;
    
    public ImageOfChanel()
    {
    imgTitle = "";
    imgLink = "";
    imgURL = "";
    }
    }

          Основным методом «RssReadera» будет метод считывания данных из RSS-ленты и заполнение данными соответствующих объектов классов, которые необходимо объявить перед телом метода.

    //Объект класса рисунка
    ImageOfChanel imageChanel = new ImageOfChanel();
    
    //Массив элементов item
    Items[] articles;
    
    //Объект класса ChannelClass
    ChannelClass channel = new ChannelClass();

          Для реализации метода задачи считывания данных из RSS-ленты и заполнение данными соответствующих объектов классов, необходимо воспользоваться библиотекой «System.ServiceModel.dll». Чтобы добавить ссылку на данную библиотеку, перейдите в Обозреватель решений и выполните клик правой клавишей мыши по элементу «References». Данный элемент группирует ссылки на сборки, которые добавляются шаблоном в проекты. Из появившегося контекстного меню выберете пункт «Добавить ссылку…».

          В открывшемся менеджере ссылок в левой части, выберете пункт на сборки. В центральной части формы вам будет предложен список библиотек для добавления в проект. Найдите пункт «System.ServiceModel.dll» и поставьте напротив него галочку. Для завершения добавления, нажмите в нижней части окна, кнопку «ОК».

    После выполнения данной операции, в Обозревателе решений у вас появится новый пункт.

          Так как RSS является диалектом XML, загружаемая информация будет представлена в виде XML-документа. Для его синтаксического анализа необходимо добавить в директиву «uses» разрешение на использование типов в пространстве имен необходимых для работы библиотек.

    using System.Xml;
    using System.IO;
    using System.Net;

    Ниже представлены два ключевых метода для работы программы, с описанием кода.

    //Метод принимает в качестве параметра ссылку на RSS-поток,
    //и возвращает либо true при успешном выполнении,
    //либо false при неудачной попытке.
    bool getNewMessage(string url)
    {
    //Весь код помещен в try...catch
    //для отслеживания  исключений
    // и вывода их в виде сообщения.
    try
    {
    //Для предотвращения ошибки 407 (Удаленный сервер возвратил ошибку:
    //(407) Требуется проверка подлинности посредника)
    //в сетях с прокси сервером
    //загрузка RSS ленты осуществляется через класс WebRequest
    //с указанием настроек прокси.
    WebRequest wr = WebRequest.Create(url);
    
    //Указываем системные учетные данные приложения,
    //передаваемые прокси-серверу для выполнения проверки подлинности.
    wr.Proxy.Credentials = CredentialCache.DefaultCredentials;
    
    //Инициализируем класс XmlTextReader, который
    //обеспечивает прямой доступ (только для чтения) к потокам данных XML.
    //и передаем ему экземпляр класса System.IO.Stream(GetResponseStream)
    //для чтения данных из интернет-ресурса.
    XmlTextReader xtr = new XmlTextReader(wr.GetResponse().GetResponseStream());
    
    //Инициализируем класс "XmlDocument". Который представляет XML-документ
    //и включает в себя метод "Load",
    //предназначенный для загрузки документа
    //с помощью объекта "XMLReader".
    XmlDocument doc = new XmlDocument();
    doc.Load(xtr);
    
    //XmlNode root - содержит корневой элемент XML для
    //загруженного элемента.
    XmlNode root = doc.DocumentElement;
    
    //Получаем количество элементов item в RSS-потоке,
    //используя SelectNodes() и
    //выражение XPath, которое позволяет это сделать.
    articles = new Items[root.SelectNodes("//rss/channel/item").Count];
    
    //Инициализируем класс System.Xml.XmlNodeList,
    //содержащий все дочерние узлы данного потока (channel).
    XmlNodeList nodeList;
    nodeList = root.ChildNodes;
    
    //Индикатор числового типа,
    //для массива articles[].
    int count = 0;
    
    //Цикл для прохода по всем каналам в RSS-потоке.
    foreach (XmlNode chanel in nodeList)
    {
    //Цикл для прохода по всем элементам cnannel.
    foreach (XmlNode chanel_item in chanel)
    {
    //Название канала RSS-потока.
    if (chanel_item.Name == "title")
    {
    channel.title = chanel_item.InnerText;
    }
    //Описание канала RSS-потока.
    if (chanel_item.Name == "description")
    {
    channel.description = chanel_item.InnerText;
    }
    //----
    if (chanel_item.Name == "copyright")
    {
    channel.copyright = chanel_item.InnerText;
    }
    //Ссылка на сайт RSS-потока.
    if (chanel_item.Name == "link")
    {
    channel.link = chanel_item.InnerText;
    }
    //Получение изображения канала RSS-потока.
    if (chanel_item.Name == "img")
    {
    XmlNodeList imgList = chanel_item.ChildNodes;
    foreach (XmlNode img_item in imgList)
    {
    if (img_item.Name == "url")
    {
    imageChanel.imgURL = img_item.InnerText;
    }
    if (img_item.Name == "link")
    {
    imageChanel.imgLink = img_item.InnerText;
    }
    if (img_item.Name == "title")
    {
    imageChanel.imgTitle = img_item.InnerText;
    }
    }
    }
    //Обработка сообщения канала RSS-потока.
    if (chanel_item.Name == "item")
    {
    XmlNodeList itemsList = chanel_item.ChildNodes;
    articles[count] = new Items();
    
    foreach (XmlNode item in itemsList)
    {
    //Заголовок сообщения.
    if (item.Name == "title")
    {
    articles[count].title = item.InnerText;
    }
    //Ссылка на сообщение в интернете.
    if (item.Name == "link")
    {
    articles[count].link = item.InnerText;
    }
    //Описание сообщения, по сути оно и является
    //самим сообщением в формате HTML.
    if (item.Name == "description")
    {
    articles[count].description = item.InnerText;
    }
    //Дата публикации сообщения.
    if (item.Name == "pubDate")
    {
    articles[count].pubDate = item.InnerText;
    }
    }
    //Увеличение счетчика сообщений
    //для массива articles.
    count += 1;
    }
    }
    }
    //После выполнения этого метода,
    //объекты классов, будут заполнены данными.
    //В imageChanel содержатся все данные о рисунке (если он есть),
    //В channel - все параметры канала,
    //Массив articles - будет содержать все сообщения.
    //И метод возвратит значение true.
    return true;
    }
    catch (Exception exc)
    {
    //Сообщение об ошибке при получении или сиснтаксическом анализе данных.
    MessageBox.Show("Ошибка получения данных :" + exc.Message);
    
    //И метод возвратит значение false.
    return false;
    }
    }
    
    //Вывод полученных данных будет происходить
    //в элементе управления WebBrowser. Все данные из RSS-потока
    //будут сохранены в виде *.html файла, и последующей его загрузки.
    bool generateHtml()
    {
    try
    {
    using (StreamWriter writer = new StreamWriter("Message.html"))
    {
    //Начало формирования HTML страницы.
    writer.WriteLine("");
    writer.WriteLine("");
    writer.WriteLine(@"");
    
    //Создание элемента  не является частью документа
    //и не показывается напрямую на веб-странице. Данный элемент
    //представляет собой, текст заголовка и
    //отображается в левом верхнем углу окна браузера.
    writer.WriteLine("<title>");
    writer.WriteLine(channel.title);
    writer.WriteLine("");
    
    //Стили применяемые к странице.
    writer.WriteLine("");
    writer.WriteLine("");
    writer.WriteLine("");
    
    //Вставка изображения из сообщения.
    writer.WriteLine(@"");
    writer.WriteLine("");
    writer.WriteLine("  ");
    
    //Вывод заголовка(гиперссылки) RSS-потока - источника.
    writer.WriteLine("" +
    @"

    " + channel.title + "

    "); //Вывод описания RSS-потока. writer.WriteLine(@"

    " + channel.description + "

    "); //Формирование html таблицы с сообщениями. writer.WriteLine(@""); //Переменная для подсчета количества и нумерации сообщений. int count_element = 0; //Очистка listBox1 перед каждой загрузкой //заголовков сообщений. listBox1.Items.Clear(); //Вставка сообщений в таблицу. foreach (Items article in articles) { //Формирование новой строки и ячейки таблицы. writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine(""); //Вставка в listBox1 заголовков сообщений. listBox1.Items.Add(count_element+". "+article.title + " (" + article.pubDate + ")"); //После вставки сообщения //увеличиваем счетчик сообщений на 1. count_element++; } //Закрывающий тег таблицы. writer.WriteLine("
    ");

    //Вставка заголовка и даты создания сообщения.
    writer.WriteLine("" + count_element + ". " + article.title + "");
    writer.WriteLine("& (" + article.pubDate + ")");

    //Вставка в ячейку подтаблицы с HTML кодом сообщения.
    writer.WriteLine(@""); writer.WriteLine("
    ");
    writer.WriteLine(article.description);
    writer.WriteLine("
    ");

    //Вставка ссылки на сообщение в интернете
    writer.WriteLine("");
    writer.WriteLine(@"Читать дальше >>>
    ");
    writer.WriteLine("
    "); //Сообщение о правах на данную информацию, //распологаемую по центру в конце страницы . writer.WriteLine(@"

    "); writer.WriteLine("" + channel.copyright + ""); writer.WriteLine(""); writer.WriteLine(""); writer.WriteLine(""); //Вывод общего количества сообщений в label2. label2.Text = "Всего сообщений: "+count_element.ToString(); //Если все выполнено успешно, метод возвратит true. return true; } } catch (Exception ex) { //Перехват ошибок и вывод в сообщении. MessageBox.Show(ex.Message); //Метод в данном случае вернет false. return false; } }

          Методом запуска процесса считывания данных будет «button1_Click», события нажатия (Click) на элемент управления «button1». Данный метод состоит из условия, состоящего из обязательного выполнения двух частей. Первая – это заполнение всех классов, вторая часть заключается в успешной генерации html страницы с сообщениями. Если обе части успешно вернули положительный результат «true», элемент управления «webBrowser1» выполнит загрузку сгенерированного файла.

    private void button1_Click(object sender, EventArgs e)
    {
    //Запуск двух методов:
    
    //1. getNewMessage - получение списка сообщений по
    //указанному URL RSS ленты.
    
    //2. generateHtml - генерация html страницы
    //для просмотра сообщений в webBrowser1.
    if (getNewMessage(@textBox1.Text) == true && generateHtml() == true)
    {
    //Открытие в  webBrowser1, сформированной страницы.
    webBrowser1.Navigate(Environment.CurrentDirectory + "\Message.html");
    }
    }

    Ниже представлен пример работы данного проекта.

    Ссылка на исходник: Rusfolder.net

    Работа с RSS в C# (Csharp): Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9