Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Delphi

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 04.02.2008, 12:52   #1
Неактивный пользователь
 
Пол:Мужской
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
Question Как "выдернуть" данные XML по http?

Задача такая: используя ссылку котировок валют с сайта Центробанка, например:
http://www.cbr.ru/scripts/XML_daily....req=02/03/2007
отобразить данные в компоненте DBGrid своего проекта.
C web-компонентами раньше не работал, ума ни приложу как это сделать.
Подскажите плиз, кто знает...
Terio вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама: вкусный букет краснодар заказатьМагазин бытовой техники: морозильный ларь бирюса б 285кх - переходи на сайт ТАЙМТВ!Лучшие замороженные пюре: фруктовое пюре купить оптом - заказывай на сайта АГРОБАР!Магазин бытовой техники: газовые плиты - переходи на сайт ТАЙМТВ!шарики голтовочные


Старый 04.02.2008, 16:52   #2
irkyt
Пользователь
 
Аватар для irkyt
 
Пол:Мужской
Регистрация: 25.11.2006
Адрес: Архангельск
Сообщений: 118
Репутация: 39
По умолчанию Ответ: Как "выдернуть" данные XML по http?

На форму кинь мемо, едит и компонент из Indy - IdHTTP
Цитата:
edit1.text:='02/03/2007';//Дата котировок
memo1.Lines.Text:=idhttp1.Get('http://www.cbr.ru/scripts/XML_daily.asp?date_req='+edit1.text); //Получаешь ГЕТОМ саму страницу в мемо1

Далее парсинг
__________________
Хочу машину, дачу и бабу в придачу.
irkyt вне форума
 
Ответить с цитированием Вверх
Старый 05.02.2008, 15:12   #3
Terio
Неактивный пользователь
 
Пол:Мужской
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
По умолчанию Ответ: Как "выдернуть" данные XML по http?

"Что-то не получается:
Project Project2.exe raised exception class EIdHTTPProtokolException with Message 'HTTP/1.1 400 Bad Request'
Может еще какие опции надо подкрутить в этом IdHTTP?"

Извиняюсь, вопрос снят, просто ссылка битая была.
Большое спасибо!
А как можно отобразить не в memo, а в DBGride в виде двух колонок:
Валюта - цена?
Какой компонент добавить к DataSource?

Последний раз редактировалось Terio; 05.02.2008 в 16:02..
Terio вне форума
 
Ответить с цитированием Вверх
Старый 05.02.2008, 17:37   #4
irkyt
Пользователь
 
Аватар для irkyt
 
Пол:Мужской
Регистрация: 25.11.2006
Адрес: Архангельск
Сообщений: 118
Репутация: 39
По умолчанию Ответ: Как "выдернуть" данные XML по http?

Лучше использовать не DBgrid (Я его только для работы с удаленными БД использую и ДатаСорс кидается на таблицу в БД для связи с DBGrid(В свойствах потом показывается после выбора Базы Данных и выбора таблиц с датаСорцом)).
Проще использовать StringGrid на вкладке "Additional"
__________________
Хочу машину, дачу и бабу в придачу.
irkyt вне форума
 
Ответить с цитированием Вверх
Старый 05.02.2008, 17:52   #5
Terio
Неактивный пользователь
 
Пол:Мужской
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
По умолчанию Ответ: Как "выдернуть" данные XML по http?

В DBGrid можно отображать локальный файл XML через связку DataSource-ClientDataSet.
Не помню как, но точно делал это.

По идее, StringGrid намного проще.
Но никак у меня не получается StringGrid-ом. Какое его свойство цеплять гетом на idHTTP?
Как вообще реализовать табличное отображение этого XML-файла?

Последний раз редактировалось Terio; 05.02.2008 в 18:02..
Terio вне форума
 
Ответить с цитированием Вверх
Старый 05.02.2008, 18:30   #6
irkyt
Пользователь
 
Аватар для irkyt
 
Пол:Мужской
Регистрация: 25.11.2006
Адрес: Архангельск
Сообщений: 118
Репутация: 39
По умолчанию Ответ: Как "выдернуть" данные XML по http?

irkyt, добавь этот кусок кода к тому что у тебя уже есть, предварительно кинь на форму StringGrid
Код:
var s,s_val:string;
num_cel:integer;
begin
s:=memo1.Text;
s_val:=s;
stringgrid1.FixedCols:=0; //Фиксированные столбцы =0
stringgrid1.FixedRows:=0; //Фиксированные строки =0
stringgrid1.ColCount:=2;  //Столбцов всего 2
stringgrid1.RowCount:=1;  //Изначально строк всего 1
num_cel:=0;
 while pos('<Name>',s)>1 do
    begin
    {Парсим страницу}
      s:=copy(s,pos('<Name>',s),length(s)-pos('<Name>',s));
      s_val:=copy(s_val,pos('<Value>',s_val),length(s_val)-pos('<Value>',s_val));
      s:=copy(s,pos('<Valute ID="',s),length(s)-pos('</Valute>',s));
      s_val:=copy(s_val,pos('<Valute ID="',s_val),length(s_val)-pos('</Valute>',s_val));
      stringgrid1.Cells[0,0]:='Австралийский доллар'; {Почему-то не понял почему не выводится(может сам найдешь ошибку в цикле, пришлось ручками}
      {Выводим все это в StringGrid}
      stringgrid1.Cells[0,num_cel+1]:=(copy(s,pos('<Name>',s)+6,pos('</Name>',s)-(pos('<Name>',s)+6)));
      stringgrid1.Cells[1,num_cel]:=(copy(s_val,pos('<Value>',s_val)+7,pos('</Value>',s_val)-(pos('<Value>',s_val)+7)));
      inc(num_cel); //Увеличиваем на 1 номер строки
      stringgrid1.RowCount:=num_cel;  //Делаем это и для StringGrid
    end;
end;
если будут - вопросы. обращайся..
__________________
Хочу машину, дачу и бабу в придачу.
irkyt вне форума
 
Ответить с цитированием Вверх
Старый 07.02.2008, 10:34   #7
Terio
Неактивный пользователь
 
Пол:Мужской
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
По умолчанию Ответ: Как "выдернуть" данные XML по http?

Все работает, большое спасибо! Я еще календарь добавиол вместо edita, вообще красота, работает быстро, удобно!

Понял, что с парсингом XML у меня напряг, подскажите пожалуйста какую-нить статью, чтобы в этой теме получше разобраться.

Последний раз редактировалось Terio; 07.02.2008 в 11:44..
Terio вне форума
 
Ответить с цитированием Вверх
Старый 07.02.2008, 15:32   #8
irkyt
Пользователь
 
Аватар для irkyt
 
Пол:Мужской
Регистрация: 25.11.2006
Адрес: Архангельск
Сообщений: 118
Репутация: 39
По умолчанию Ответ: Как "выдернуть" данные XML по http?

Насчет статей па парсингу, навряд ли что-то найдете, а вот работу со строками и операции insert,copy,pos,length(),delete и т.д, можно почитать
__________________
Хочу машину, дачу и бабу в придачу.
irkyt вне форума
 
Ответить с цитированием Вверх
Старый 08.02.2008, 16:30   #9
Terio
Неактивный пользователь
 
Пол:Мужской
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
Smile Ответ: Как "выдернуть" данные XML по http?

Немного подкорректировал код. Действительно, в цикле была небольшая ошибка (Valute ID начинается раньше Name, и цикл делаю именно по нему).
Вот что получилось:
Код:
procedure TForm3.Button1Click(Sender: TObject);
var d,s,s_val:string;
num_cel:integer;
MyDate: tDateTime;
begin
//MonthCalendar1.Date:=StrToDate(Edit1.Text);
MyDate:=MonthCalendar1.Date;
d:=DateToStr(MyDate);
edit1.text:=d;
memo1.Lines.Text:=idhttp1.Get('http://www.cbr.ru/scripts/XML_daily.asp?date_req='+edit1.text);
s:=memo1.Text;
s_val:=s;
stringgrid1.FixedCols:=0; //Фиксированные столбцы =0
stringgrid1.FixedRows:=1; //Фиксированные строки =1
stringgrid1.ColCount:=2;  //Столбцов всего 2
stringgrid1.RowCount:=2;  //Изначально строк всего 2
StringGrid1.Rows[0].Strings[0]:='Валюта';
StringGrid1.Rows[0].Strings[1]:='Курс (руб.)';
num_cel:=1;
 while pos('<Valute ID="',s)>0 do
    begin
    {Парсим страницу}
      s:=copy(s,pos('<Valute ID="',s));
      s:=copy(s,pos('<Name>',s),length(s)-pos('<Name>',s));
      s_val:=copy(s_val,pos('<Valute ID="',s_val));
      s_val:=copy(s_val,pos('<Value>',s_val),length(s_val)-pos('<Value>',s_val));
        {Выводим все это в StringGrid}
      stringgrid1.Cells[0,num_cel]:=(copy(s,pos('<Name>',s)+6,pos('</Name>',s)-(pos('<Name>',s)+6)));
      stringgrid1.Cells[1,num_cel]:=(copy(s_val,pos('<Value>',s_val)+7,pos('</Value>',s_val)-(pos('<Value>',s_val)+7)));
      inc(num_cel); //Увеличиваем на 1 номер строки
      stringgrid1.RowCount:=num_cel;  //Делаем это и для StringGrid
    end;
end;
Большое спасибо irkyt, ты очень помог.

Последний раз редактировалось Terio; 08.02.2008 в 16:57..
Terio вне форума
 
Ответить с цитированием Вверх
Старый 08.02.2008, 19:31   #10
irkyt
Пользователь
 
Аватар для irkyt
 
Пол:Мужской
Регистрация: 25.11.2006
Адрес: Архангельск
Сообщений: 118
Репутация: 39
По умолчанию Ответ: Как "выдернуть" данные XML по http?

Да, действительно
Просто писал "на коленках" можно сказать. Сам понял, что ошибся немного
__________________
Хочу машину, дачу и бабу в придачу.
irkyt вне форума
 
Ответить с цитированием Вверх
Старый 13.02.2008, 17:32   #11
SilverDragon
Неактивный пользователь
 
Пол:Мужской
Регистрация: 31.07.2007
Сообщений: 5
Репутация: 1
По умолчанию Ответ: Как "выдернуть" данные XML по http?

Цитата:
Сообщение от Terio Посмотреть сообщение
Все работает, большое спасибо! Я еще календарь добавиол вместо edita, вообще красота, работает быстро, удобно!

Понял, что с парсингом XML у меня напряг, подскажите пожалуйста какую-нить статью, чтобы в этой теме получше разобраться.

В принципе если воспользоваться парсером от Microsoft, то код можно сделать более изящным. Информацию о классах и методах можно получить в MSDN.

В примере используется 5 версия парсера.
Перед использованием необходимо импортировать COM-библиотеку "Microsoft XML, v5.0" (файл msxml5.dll)
Пример нормально будет работать для жесткого порядка тэгов в получаемом xml.

Код:
var
  Document: IXMLDOMDocument2;
  sData: string;
  I: Integer;

...

  Document := CoDOMDocument50.Create;
  try
    Document.Async := False;
    Document.load('http://www.cbr.ru/scripts/XML_daily.asp?date_req=' + sDate);
    for I := 0 to Document.childNodes.Length - 1 do
    begin
      <Наименование> := Document.childNodes[I].childNodes[3].nodeValue;
      <Коэффициент> := Document.childNodes[I].childNodes[2].nodeValue;
      <Курс> := Document.childNodes[I].childNodes[4].nodeValue;
    end;
  finally
    Document := nil;
  end;

...
SilverDragon вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Журнал: "Guadros" /"Genefas" / "Toallas" (en punto de cruz) IGLENA Вышивка 5 06.02.2026 17:47
Журнал: "Knitting" / "EasyKnitting" / "Knitscene" stupikosha Вязание 161 11.05.2025 21:20
Где в опере хранятся пароли и личные данные, сохраненные "жезлом"? jhfgry Архив 5 06.11.2006 01:56

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 21:18. Часовой пояс GMT +3.


Copyright ©2004 - 2026 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.05993 секунды с 13 запросами