Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TNMHttp


Автор: Alkash 6.3.2007, 11:58
Здравствуйте уважаемые.
Вот пишу одну процедурку 
Код

Procedure GetNews(Host,ChannelAdress: String;Memo: Tmemo );
var
_xml:TXMLDocument;
I:Integer;
begin
 form1.Downloader.Host:= Host;
 form1.Downloader.Connect;
 try
  form1.Downloader.Get(ChannelAdress);
  if Form1.Downloader.Connected = true then
   begin
//Вот что тут делать - понятия не имею-(
end;

А вопрос в следующем, после того как я получу методом Get страничку, откуда мне взять данные, чтобы её пропарсить?

Автор: Yanis 6.3.2007, 12:14
Что такое Downloader?

Автор: _hunter 6.3.2007, 12:18
Alkash, ну посмотри в справке принимаемые/отдаваемые параметры...

Цитата(Yanis @  6.3.2007,  12:14 Найти цитируемый пост)
Что такое Downloader?

TNMHttp ;)

Автор: Alkash 6.3.2007, 12:20
Downloader - TNMHTTP, к сожалению я не до конца соображаю, в какую часть компонента у меня данные получаются. Например в Header идёт заголовок, а в body идёт само тело странички? Я работаю с XML, вот поэтому чуток подтупливаю smile 

Автор: Yanis 6.3.2007, 12:38
Цитата(Alkash @  6.3.2007,  13:20 Найти цитируемый пост)
в какую часть компонента у меня данные получаются. 

Может в AResponseContent?
Код
procedure TIdCustomHTTP.Get(AURL: string; const AResponseContent: TStream);

Автор: _hunter 6.3.2007, 12:38
Цитата(Alkash @  6.3.2007,  12:20 Найти цитируемый пост)
к сожалению я не до конца соображаю, в какую часть компонента у меня данные получаются

ну так проснифь запрос...
данные (они же XML) должны быть в Body.

Добавлено @ 12:39 
Yanis, дык это ж для Indy. не факт что в NM та же сигнатура...

Автор: Yanis 6.3.2007, 12:42
Цитата(_hunter @  6.3.2007,  13:38 Найти цитируемый пост)
Yanis, дык это ж для Indy. не факт что в NM та же сигнатура... 

 smile 

Автор: Alkash 6.3.2007, 12:42
Ну дык вот в принципе какая процедурка вышла, только не пыхтит она что-то-(
Код

Procedure GetNews(Host,ChannelAdress: String;Memo: Tmemo );
var
_xml:TXMLDocument;
I:Integer;
begin
 form1.Downloader.Host:= Host;
 form1.Downloader.Connect;
  form1.Downloader.Get(ChannelAdress);
  if Form1.Downloader.Connected = true then
   begin
    _xml:=TXMLDocument.Create(form1);
    _xml.LoadFromFile(form1.Downloader.Body);
    _xml.Active:=true;

Memo.Lines.Add('Èíôîðìàöèÿ î êàíàëå: '+#13#10);
//Âûâîäèì èíôîðìàöèþ
with _xml.DocumentElement.ChildNodes['channel'] do
begin
if not (ChildNodes.FindNode('title')=nil) then
Memo.Lines.Add('Íàçâàíèå: '+ChildNodes.Nodes['title'].NodeValue);

if not (ChildNodes.FindNode('link')=nil) then
Memo.Lines.Add('Àäðåñ:' +ChildNodes.Nodes['link'].NodeValue);

if not (ChildNodes.FindNode('copyright')=nil) then
Memo.Lines.Add('Copyright: '+ChildNodes.Nodes['copyright'].NodeValue)
else
Memo.Lines.Add('Copyright: N/A');

if not (ChildNodes.FindNode('lastBuildDate')=nil) then
Memo.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
Memo.Lines.Add('Òåìà: '+ChildNodes.Nodes[i].ChildNodes['title'].NodeValue);

if not (childNodes.Nodes[i].ChildNodes['link']=nil) then
Memo.Lines.Add('Ññûëêà: '+ChildNodes.Nodes[i].ChildNodes['link'].NodeValue);

if not (ChildNodes.Nodes[i].ChildNodes['decription']=nil) then
Memo.Lines.Add('Òåêñò íîâîñòè: '+ChildNodes.Nodes[i].ChildNodes['description'].NodeValue+#13#10);

if not (childNodes.Nodes[i].ChildNodes['pubDate']=nil) then
Memo.Lines.Add('Äàòà äîáàâëåíèÿ: '+childNodes.Nodes[i].ChildNodes['pubDate'].NodeValue);

//Âîò ÷òî òóò äåëàòü - ïîíÿòèÿ íå èìåþ-(

end;
end;
end;
_xml.Free;
end;

end;

Не хочет коннектиться видимо, во что тут не так........
Вызываю её так:
 
Код

GetNews('http://www.nneformat.ru','http://www.nneformat.ru/rss.xml',form1.Memo1);


Добавлено @ 12:45 
Цитата(Yanis @ 6.3.2007,  12:38)
Цитата(Alkash @  6.3.2007,  13:20 Найти цитируемый пост)
в какую часть компонента у меня данные получаются. 

Может в AResponseContent?
Код
procedure TIdCustomHTTP.Get(AURL: string; const AResponseContent: TStream);

В NMHttp у Get только параметр URL: String.

Автор: _hunter 6.3.2007, 13:56
Цитата(Alkash @  6.3.2007,  12:42 Найти цитируемый пост)
 только не пыхтит она что-то

Цитата(Alkash @  6.3.2007,  12:42 Найти цитируемый пост)
Не хочет коннектиться видимо, во что тут не так........

очень информативное описание проблемы...
ну поставь сниффер и посмотри что происходит.

P.S.
а какова причина использования именно этих компонентов?

Автор: Alkash 6.3.2007, 14:18
Причина - наличие их в 6 дельфях-)Если есть другие предложения то с радостью рассмотрю smile 
Вот, вынес коннект в отдельную функцию: 
Код


Function GetNewsText(Host,Adress: String): String;
 begin
  try
   form1.Downloader.Host:= Host;
   form1.Downloader.Connect;
   form1.Downloader.Get(Host+Adress);
  except
   ShowMessage('oops');
  end;
 result:= form1.Downloader.Body;
 end;

И выдаётся ESocketError - Host lockup failed........Чё я не так делаю? smile 

Автор: MetalFan 6.3.2007, 14:22
все нормально работает
InputFileMode = OutputFileMode = false
Код

  NMHTTP.Get('http://ya.ru');
  mem.Lines.Text := NMHTTP.Body;


Цитата(Alkash @  6.3.2007,  14:18 Найти цитируемый пост)
Host lookup failed

ну тебе же написали. не найден хост с таким именем.

Автор: Alkash 6.3.2007, 14:25
Тогда почему я браузером свободно на этот хост захожу?
http://www.nneformat.ru/rss.xml
Сюда я попадаю с браузера нормально, а прогой не выходит.

Автор: MetalFan 6.3.2007, 14:33
Alkash, не знаю, у меня мой код(выше приведен) нормально грузит содержание rss.xml (вместо ya.ru поставил твою урл)

Автор: Alkash 6.3.2007, 14:42
Да, это у меня косяк был-)А вот ещё трабл - теперь получать то инфу я получаю, а вот 
Код

Function GetNewsText(Adress: String): String;
 begin
   form1.Downloader.Get(Adress);
 result:= form1.Downloader.Body;
 end;
Procedure ParseNews(S: String;Memo1:Tmemo);
var
_xml:TXMLDocument;
I:Integer;
begin
//Ñîçäàåì îáúåêò òèïà TXMLDocument
_xml:=TXMLDocument.Create(form1);
//Çàãðóæàåì â íåãî ôàéë ñ íîâîñòÿìè
_xml.LoadFromFile(S);
//Äåëàåì àêòèâíûì
_xml.Active:=true;

Memo1.Lines.Add('Èíôîðìàöèÿ î êàíàëå: '+#13#10);
//Âûâîäèì èíôîðìàöèþ

Как теперь это body пропарсить? DCOM ошибку выдаёт, хотя код на скачаном файле нормально работает-(

Автор: _hunter 6.3.2007, 14:53
Цитата(Alkash @  6.3.2007,  14:42 Найти цитируемый пост)
DCOM ошибку выдаёт, хотя код на скачаном файле нормально работает

а этот файл точно существует? структура правильная (в IE его открой)?

Автор: Alkash 6.3.2007, 14:56
Дык в качестве файла у меня идёт form1.Downloader.Body;

Автор: MetalFan 6.3.2007, 15:05
Цитата(Alkash @  6.3.2007,  14:42 Найти цитируемый пост)
DCOM ошибку выдаёт


Цитата

_xml.LoadFromFile(S);

а что ты хотел? ты же на вход даешь ТЕКСТ xml, а не имя файла.


Автор: Alkash 6.3.2007, 16:09
Спасибо, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)