Здравствуйте, вот публикую в блог юбилейную запись (100 запись в блоге), в этой статье хотел бы продолжить рассказать о том, как можно прочитать RSS-потоки, если Вам это конечно необходимо. Вообще в прошлой статье я рассказал об этом, тот вариант более правильный, удобный. Но есть еще массу вариантов, о которых я тоже говорил. Можно читать с помощью компонентов, которых в сети очень полно для различный версий Delphi, но это уже очень простой вариант. Данный пример будет заключаться на парсинге данных. Конечно быстроту того или иного метода можно определить, но как по мне, так первый способ, про который я рассказывал, то он является более быстрым, хотя там в каком-то случае тоже есть своего рода парсинг данных, это легко убедиться, открыв модуль XML. Так , что смотря какой парсинг Вы напишите, тоже будет зависеть от быстроты чтение rss-потока, то есть парсинг, который я покажу сейчас, естественно будет медленее, чем через, например, регулярные выражения, так что все будет зависеть от Вас. Парсинг у меня будет очень простой и сразу скажу, что не очень быстрый, но при возможности можно доработать или написать свой. Для всего этого нам из компонентов понадобится TIdhTTP - который поможет нам загружать rss-поток, а затем нам его очень будет легко парсить.
Ну кроме этого, как и в прошлой статье у меня на форме еще установлены компоненты такие как
- TButton
- TListBox — 2 шт.
Ну, что в переменную как загрузить rss-поток нам труда не составит, сделаем это следующим образом
procedure TForm1.Button1Click(Sender: TObject);
var
rss:WideString;
begin
rss:=IdHTTP1.Get('https://devdelphi.ru/?feed=rss2');
ShowMessage(rss);
end;
Как помните из прошлых статей, мы здесь используем метод GET. Далее можем вывести данную переменную и посмотреть в каком виде (формате) нам загрузила данные rss-потока. Раньше мы уже парсили rss-данные, вспомним только проект ВК API в Delphi, там мы ответ получали в виде rss-данных, но некоторые в виде JSON. Так, что как видите здесь смысл парсинга остается тем же самым, нам остается получить данные, которые заключены в конкретные теги. В данном случае мы будем получать из следующих тегов
- <title></title> — название статьи
- <link></link> — url на статью
Для этого нам понадобиться запустить цикл и пока будет в нашем rss-потоке находиться эти теги, мы будем парсить до тех пор, как только их не будет (мы после каждой статьи будем их удалять) прекратим парсинг нашего rss-потока. Вообще невооруженным глазом можно увидеть, что в прошлой статье пример работает намного быстрее чем предложу я сейчас второй, но опять же все завиcет от Вас, как Вы сможете и насколько лучше организовать парсинг данных, например, неплохо организовать парсинг на регулярных выражениях, в следующей статье хотел бы рассмотреть это и наконец-то выявить быстрый способ чтения, ну и конечно если это все закинуть в поток, то пользователь можно сказать и не заметит какой способ быстрее, так как обработка данных все равно будет происходит в фоновом режиме. Вот следующий код парсинга я написал на событие OnClick.
procedure TForm1.Button1Click(Sender: TObject);
var
rss,title,link:WideString;
i:integer;
begin
rss:=IdHTTP1.Get('https://devdelphi.ru/?feed=rss2');
i:=1;
title:='';
while (i<=length(rss)) do
begin
if pos('<title>',rss)<>0 then
begin
Delete(rss,1,pos('<title>',rss)+length('<title>')-1);
title:=copy(rss,1,pos('</title>',rss)-1);
ListBox2.Items.Add(Utf8ToAnsi(title));
Delete(rss,1,pos('<link>',rss)+length('</link>')-2);
link:=copy(rss,1,pos('</link>',rss)-1);
ListBox1.Items.Add(Utf8ToAnsi(link));
i:=0;
end;
inc(i);
end;
end;
Ну здесь на всякий случай использую Utf8ToAnsi, так как моя версия Indy никак не хочет в правильной кодировке забирать данные.