Здравствуйте, давно я не писал в блог ничего, но сами понимаете времени не так много, скоро начну писать о том, как я пытался зарабатывать в сети Интернет, в том числе это будет связано и с программированием. Ну а пока что, я хотел рассказать о том, как можно без сторонних компонентов очень хорошо и быстро прочитать RSS-новости, ну по крайней мере отобразить их названия и ссылку на них. Что нам для этого понадобится из визуальных компонентов:
- TListBox — 2 шт
- TButton
- TEdit
В TEdit мы будет вводить url нашего rss-потока, в 1 TListBox мы будем получать url нашей новости, а во второй TListBox будем получать название нашей новости. Да кстати, если Вы обратили внимание, то в новости присутсвует Часть 1, это означает, что в следующей статье я покажу как можно сделать чтение rss-новостей с помощью парсинга и тогда Вы увидите различия. Конечно все будет зависеть от того на сколько быстрый парсинг новостей, но об этом немного потом. Для начала давайте подключим модули, необходимые нам при работе:
- MSXML
- Shellapi
MSXML — для чтение rss-потоков, Shellapi — для того, чтобы воспользоваться функцией ShellExecute, которая поможет нам открывать ссылки новостей в браузере. Ну так вроде бы у нас все готово, теперь можем приступать к работе.
Для начала объявим необходимые переменные
var
CoD:CoDOMDocument;
XML:DOMDocument;
ixml:IXMLDOMElement;
node:IXMLDOMNode;
url:WideString;
i:integer;
XML — объект самого DOM документа, ixml — элемент DOM документа, а node — узел DOM документа, то есть узел rss-потока, url — будет хранить адресс нашего rss-потока, а i — счетчик, который понадобится нам для того, чтобы пройтись по всем узлам нашего rss-потока.
Весь код, который я написал на событие OnClick TButton выглядет следующим образом
procedure TForm1.Button1Click(Sender: TObject);
var
CoD:CoDOMDocument;
XML:DOMDocument;
ixml:IXMLDOMElement;
node:IXMLDOMNode;
url:WideString;
i:integer;
begin
try
url:=Edit1.Text;
XML:=CoD.Create;
XML.async:=False;
XML.load(url);
ixml:=XML.documentElement;
node:=ixml.selectSingleNode('//rss');
if node.attributes.getNamedItem('version').text<>'2.0' then
begin
ShowMessage('Error is version rss');
exit;
end;
Caption:=node.selectSingleNode('//title').text;
for i:=0 to node.selectnodes('//item').length-1 do
begin
ListBox2.Items.Add(node.selectnodes('//item').item[i].childNodes.item[0].text);
ListBox1.Items.Add(node.selectnodes('//item').item[i].childNodes.item[1].text);
end;
except
on e:Exception do
end;
end;
Вначале мы создаем наш документ XML, затем задаем как будем грузить в него данные, а с помощью метода load загружаем сам наш поток, причем его можно загрузить не только как url, но и как текстовый файл, либо xml-файл. Далее мы просто перебираем нам нужные узлы в нашем rss-потоке. Как получить нужные узлы Вы увидели, с помощью двойной наклонной черты, а затем само название узла, так можно получить любой узел. В данном примере мы только получаем версию rss, заголов сайта и затем название 10 последних новостей и ссылки на них. Можете поэксперментировать, доработать кое-что, а потом будем сравнивать насколько быстрее работает чтение rss-новостей с помощью обычного парсинга.
С помощью данного примера можно очень легко сделать отличную и очень простую rss-читалку, причем без всяких сторонних компонентов.
Полный исходник можно скачать тут (в исходнике по двойному клику по названию статьи открывается в браузере по умолчанию url статьи)