altВ своей статье про RSS я упомянул, что для получения новостей в этом формате я использую тулзу собственного написания. В этой статье я хочу поделиться с тобой своим маленьким опытом в этом деле.

Теория

Давай для начала разберем принцип работы всех этих читалок. Первым делом они скачивают с сайта файл с новостями (как ты помнишь это обычный xml файл). Далее они его открывают и анализируют теги. Вот в принципе и вся теория. Не, конечно у программок есть всякие фенечки, вроде автоматического обновления и т.д., но нас сегодня это не будет интересовать. Мы рассмотрим только чтение самого файла с новостями.

Форма

Для начала давай нарисуем форму. Из компонентов нам понадобится: две кнопки, один TOpenDialog и один TMemo. Всю прочитанную информацию мы будем отображать в Memo. Для нашего простенького примера этого вполне хватит. Свои дизайнерские способности применишь в другой раз :).

Располагай эти компоненты на форме как душе угодно, то, что получилось у меня, ты можешь увидеть на рисунке 1.


Рис.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’].  Как видишь, в начале, в качестве дочернего элемента (в xml это так принято называть) указываем channel (равносильно тегу , только нужно указывать без ). Именно после этого тега идет описание канала и соответственно новостей. Разобрался? Сначала я считываю инфу о канале (, и т.д.), а потом перехожу к новостям. Каждая новость, как ты знаешь, идет после тега . Т.е. такими нехитрыми манипуляциями я прочитываю весь файл с новостями. В реальном примере можно считывать дополнительные теги, вроде , и т.д. Принцип остается тот же.

Чтение файла реализовано через объект TXMLDocument (OLE). Этот объект специально предназначен для работы с xml файлами, поэтому работать с ним удобно и просто.

Если тебя потянуло на подвиги, то можешь написать свой парсер RSS тегов. В принципе, сложного ничего нет, нужно только терпение и кучу расходных материалов (пиво, сок, кофе, чай :)).

Заключение

Как видишь, для написания собственной программы чтения RSS новостей не нужно огромных познаний в кодинге, нужно лишь только чуточку терпения и фантазии. Если хорошо оформить этот пример (сделать нормальный интерфейс, добавить функции для скачивания новостей, организовать поддержку нескольких каналов, etc…), то можно попытаться сделать его Shareware и продавать буржуям :))).