| В своей статье про RSS я упомянул, что для получения новостей в этом формате я использую тулзу собственного написания. В этой статье я хочу поделиться с тобой своим маленьким опытом в этом деле . Теория Давай для начала разберем принцип работы всех этих читалок. Первым делом они скачивают с сайта файл с новостями (как ты помнишь это обычный xml файл). Далее они его открывают и анализируют теги. Вот в принципе и вся теория. Не, конечно у программок есть всякие фенечки, вроде автоматического обновления и т.д., но нас сегодня это не будет интересовать. Мы рассмотрим только чтение самого файла с новостями. Форма Для начала давай нарисуем форму. Из компонентов нам понадобится: две кнопки, один TOpenDialog и один TMemo. Всю прочитанную информацию мы будем отображать в Memo. Для нашего простенького примера этого вполне хватит. Свои дизайнерские способности применишь в другой раз :). Располагай эти компоненты на форме как душе угодно, то, что получилось у меня, ты можешь увидеть на рисунке 1. [img]images/review/rss_reader.jpg[/img] Рис.1 (Форма программы) Кодинг Создай обработчик события OnClick для кнопки «Открыть» и напиши в него код: var _xml:TXMLDocument; I:Integer; begin if not OpenDialog1.Execute then Exit; Memo1.Lines.Clear; //Создаем объект типа TXMLDocument _xml:=TXMLDocument.Create(self); //Загружаем в него файл с новостями _xml.LoadFromFile(OpenDialog1.FileName); //Делаем активным _xml.Active:=true; Memo1.Lines.Add('Информация о канале: '+#13#10); //Выводим информацию with _xml.DocumentElement.ChildNodes['channel'] do begin if not (ChildNodes.FindNode('title')=nil) then Memo1.Lines.Add('Название: '+ChildNodes.Nodes['title'].NodeValue); if not (ChildNodes.FindNode('link')=nil) then Memo1.Lines.Add('Адрес:' +ChildNodes.Nodes['link'].NodeValue); if not (ChildNodes.FindNode('copyright')=nil) then Memo1.Lines.Add('Copyright: '+ChildNodes.Nodes['copyright'].NodeValue) else Memo1.Lines.Add('Copyright: N/A'); if not (ChildNodes.FindNode('lastBuildDate')=nil) then Memo1.Lines.Add('Дата последнего обновления: '+ChildNodes['lastBuildDate'].NodeValue+#13#10); if not (ChildNodes.FindNode('item')=nil) then begin for I:=0 to ChildNodes.Count-1 do if ChildNodes[i].NodeName='item' then begin if not (ChildNodes.Nodes[i].ChildNodes['title']=nil) then Memo1.Lines.Add('Тема: '+ChildNodes.Nodes[i].ChildNodes['title'].NodeValue); if not (childNodes.Nodes[i].ChildNodes['link']=nil) then Memo1.Lines.Add('Ссылка: '+ChildNodes.Nodes[i].ChildNodes['link'].NodeValue); if not (ChildNodes.Nodes[i].ChildNodes['decription']=nil) then Memo1.Lines.Add('Текст новости: '+ChildNodes.Nodes[i].ChildNodes['description'].NodeValue+#13#10); if not (childNodes.Nodes[i].ChildNodes['pubDate']=nil) then Memo1.Lines.Add('Дата добавления: '+childNodes.Nodes[i].ChildNodes['pubDate'].NodeValue); end; end; end; _XML.Free; end; Перед тем как пытаться запустить программу, не забудь добавить в Uses: XMLDoc, XMLIntf, XMLDOM. В исходнике нет ничего сложно. Все крутится вокруг _xml.DocumentElement.ChildNodes['channel']. Если ты читал мою статью про RSS, то уже должен во всем разобраться. Как видишь, в начале, в качестве дочернего элемента (в xml это так принято называть) указываем channel (равносильно тегу , только нужно указывать без <>). Именно после этого тега идет описание канала и соответственно новостей. Разобрался? Сначала я считываю инфу о канале (, , и т.д.), а потом перехожу к новостям. Каждая новость, как ты знаешь, идет после тега . Т.е. такими нехитрыми манипуляциями я прочитываю весь файл с новостями. В реальном примере можно считывать дополнительные теги, вроде , и т.д. Принцип остается тот же. Чтение файла реализовано через объект TXMLDocument (OLE). Этот объект специально предназначен для работы с xml файлами, поэтому работать с ним удобно и просто. Если тебя потянуло на подвиги, то можешь написать свой парсер RSS тегов. В принципе, сложного ничего нет, нужно только терпение и кучу расходных материалов (пиво, сок, кофе, чай :)). Заключение Как видишь, для написания собственной программы чтения RSS новостей не нужно огромных познаний в кодинге, нужно лишь только чуточку терпения и фантазии. Если хорошо оформить этот пример (сделать нормальный интерфейс, добавить функции для скачивания новостей, организовать поддержку нескольких каналов, etc…), то можно попытаться сделать его Shareware и продавать буржуям :))).
|