Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг xml 
:(
    Опции темы
MrDmitry
Дата 14.11.2011, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Здраствуйте, пишу программку которая возможно будет использоваться через proxy. Программа получает данные из xml и выводит их в таблицу. Парсинг я делаю при помощи XMLDocument со вкладки internet. Т.к я не нашёл как заставить работать этот компонент через rpoxy решил вначале получить содержимое xml при помощи idhhtp записать это содержимое в файл. Парсить этот файл при помощи XMLDocument. Удалить файл. Вот код


Код

procedure card_list(http, key:string);
var
  data: TIdMultiPartFormDataStream;
  IdHTTP1: TIdHTTP;
  url:string;
  res:string;
begin
  url:=http + 'action=18&session_key=' + key;
  IdHTTP1 := TIdHTTP.Create;
  data := TIdMultiPartFormDataStream.Create;
  try
    if idHTTP1.Response.ResponseText='HTTP/1.0 200 OK' then
   ShowMessage('Ошибка подключения к сети')
  else
   begin
   if (ips<>' ') or (ips<>'') then
    begin
     IdHTTP1.ProxyParams.ProxyServer:=ips;
     IdHTTP1.ProxyParams.ProxyPort:=ports;
     IdHTTP1.ProxyParams.ProxyUsername:=users;
     IdHTTP1.ProxyParams.ProxyPassword:=password;
    end;
    res:=IdHTTP1.get(url);
   end;
  finally
    data.Free;
  end;
end;



procedure TMain.FormShow(Sender: TObject);
var
  info_phone, info_name, info_surname, info_patrynamic, info_fio, info_card, translit_info_fio:string;//Полученные данные из xml
  counts, k:integer; //Количество элементов в xml
  savef:textfile;
begin
 AssignFile(savef,'pars.xml');
    Rewrite(savef);
    CloseFile(savef);
    append(savef);
    Writeln(savef,ansitoutf8(card_list(http, sesion_key)));
    Flush(savef);
    CloseFile(savef);
dataModule2.XMLDocument1.LoadFromfile(pars.xml);

counts :=  DataModule2.XMLDocument1.DocumentElement.ChildNodes.Count;

k:=-1;

while k<counts-1 do
 begin
   inc(k);
   info_phone := DataModule2.XMLDocument1.DocumentElement.ChildNodes[k].ChildNodes[0].text;
   info_card := DataModule2.XMLDocument1.DocumentElement.ChildNodes[k].ChildNodes[1].text;
   info_name := DataModule2.XMLDocument1.DocumentElement.ChildNodes[k].ChildNodes[2].text;
   info_surname := DataModule2.XMLDocument1.DocumentElement.ChildNodes[k].ChildNodes[3].text;
   info_patrynamic := DataModule2.XMLDocument1.DocumentElement.ChildNodes[k].ChildNodes[4].text;
   info_fio:=info_surname+' '+info_name+' '+info_patrynamic;
   translit_info_fio:=Translit(info_fio);

   List1.list_card.RowCount:=List1.list_card.RowCount+1;
   List1.list_card.Cells[0,List1.list_card.RowCount-2]:=info_phone;
   List1.list_card.Cells[1,List1.list_card.RowCount-2]:=translit_info_fio;
 end;
end;

end;


end;


Таким подходом программа тупо зависает когда я пытаюсь выполнить любой другой запрос на сервер например такой:

Код


procedure registration(http, key, phone:string; name, surname, patronamic,
  birth: string)stdcall; export;
var
  data: TIdMultiPartFormDataStream;
  IdHTTP1: TIdHTTP;
  url:string;
  res: string;
begin
  url:=http + 'action=2&session_key=' + key + '&phone=' + phone + '&name=' + Translit(name) + '&surname=' + Translit(surname) + '&patronymic=' + Translit(patronamic) + '&birth=' + birth+sms;
  IdHTTP1 := TIdHTTP.Create;
  data := TIdMultiPartFormDataStream.Create;
  try
    if idHTTP1.Response.ResponseText='HTTP/1.0 200 OK' then
   ShowMessage('Ошибка подключения к сети')
  else
   begin
   if (ips<>' ') or (ips<>'') then
    begin
     IdHTTP1.ProxyParams.ProxyServer:=ips;
     IdHTTP1.ProxyParams.ProxyPort:=ports;
     IdHTTP1.ProxyParams.ProxyUsername:=users;
     IdHTTP1.ProxyParams.ProxyPassword:=password;
    end;
    res:=IdHTTP1.get(url);
    if log=1 then
        logs(url,res);
   end;
  finally
    data.Free;
  end;
end;



Но стоит убрать строку где я записываю файл pars.xml и все становится нормально. Не понимаю почему так? (
PM MAIL   Вверх
Akella
Дата 14.11.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Цитата(MrDmitry @  14.11.2011,  09:09 Найти цитируемый пост)
Но стоит убрать строку где я записываю файл pars.xml и все становится нормально. Не понимаю почему так? ( 

сети тут при чем
PM MAIL   Вверх
MrDmitry
Дата 14.11.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Возможно. Но мне кажется что тут дело во взаимодействии XMLDocument и с записью в файл
PM MAIL   Вверх
MetalFan
Дата 14.11.2011, 14:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата
Но стоит убрать строку где я записываю файл pars.xml

Эта чтоли строка?
Код
Writeln(savef,ansitoutf8(card_list(http, sesion_key)));

Ну там помимо записи, как я понял, еще происходит получение данных с сервера.
Т.е. программа "зависает" на время получения данных с сервера в функции card_list.
И т.к. Indy - синхронные компоненты, то логично, что на время получения данных с сервера приложение "зависнет".
тут видны два варианта: 
  • правильный: вынести получение и парсинг данных с сервера в отдельный поток
  • простой: кинуть на форму idAntiFreeze (и при этом лучше вынести код по загрузке и парсингу из OnShow)


Это сообщение отредактировал(а) MetalFan - 14.11.2011, 14:25


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.