Главная » 2012»Апрель»13 » Как получить курсы валют с сайта ЦБ РФ пример на Delphi.
08:05
Как получить курсы валют с сайта ЦБ РФ пример на Delphi.
на офицальном сайте Центрального Банка России есть материал регламентирующий работу с данными о курсах валют
Получение данных, используя XML http://www.cbr.ru/scripts/Root.asp?Prtid=SXML
Пример1 Например, для получения котировок на заданный день http://www.cbr.ru/scripts/XML_daily.asp?date_req=02/03/2002 date_req= Date of query (dd/mm/yyyy) * если параметр(date_req) отсутствует, то Вы получите документ на последнюю зарегистрированную дату.
-- Справочник по кодам валют: http://www.cbr.ru/scripts/XML_val.asp?d=0 d=0 Коды валют устанавливаемые ежедневно. d=1 Коды валют устанавливаемые ежемесячно.
Об изменении даты вступления в силу Приказа Банка России о курсах иностранных валют, устанавливаемых Банком России ежемесячно Пример 2 ... на сайте.
Немного о XML
XML — это описанная в текстовом формате иерархическая структура, предназначенная для хранения любых данных. Визуально структура может быть представлена как дерево элементов. Элементы XML описываются тегами.
Рассмотрим пример простого кулинарного рецепта, размеченного с помощью XML:
<recipe name="хлеб" preptime="5" cooktime="180"> <title>Простой хлеб</title> <ingredient amount="3" unit="стакан">Мука</ingredient> <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient> <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient> <ingredient amount="1" unit="чайная ложка">Соль</ingredient> <instructions> <step>Смешать все ингредиенты и тщательно замесить.</step> <step>Закрыть тканью и оставить на один час в тёплом помещении.</step> <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... --> <step>Замесить ещё раз, положить на противень и поставить в духовку.</step> </instructions> </recipe> взято с сайта http://ru.wikipedia.org/wiki/XML
для этого 1. необходима реализовать доступ к XML файлу 2. разобрать структуру XML файла 3. Получить список валют и обменный курс валюты
1. Реализуем доступ к файлу
объявим глобальную переменную uses WinInet;
Type Tvaluta=record
ValutaName:string;
Value:Extended;
FullName:string;
Nominal:Extended; end;
var Form1: TForm1; XMLDoc:string;
implementation
// функция получения текстового файла из сети интернет
function GetCursFile (const fileURL:string): string; const BufferSize = 1024; var hSession, hURL: HInternet; Buffer: array[1..BufferSize] of char; BufferLen: DWORD; f: File; sAppName: String; begin result:=''; sAppName := ExtractFileName(Application.ExeName); hSession :=InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0); try repeat InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); result:=result+Buffer; until BufferLen = 0; finally InternetCloseHandle(hURL) end finally InternetCloseHandle(hSession) end end;
// не большая процедура - формирует строку запроса (URL) к серверу ЦБ РФ в зависимости от даты.
Function GetUrlCBRF(date:Tdate):string; begin result:='http://www.cbr.ru/scripts/XML_daily.asp?date_req='+FormatDateTime('DD/MM/YYYY',date); end;
2. разобрать структуру XML файла
// копировать текст между тегами Function CopyTextFromTeg(s:string;s1,s2:string):string; var i1,i2:integer; sm:string; begin i1:=pos(s1,s); sm:=copy(s,i1,length(s)); i2:=pos(s2,sm)+i1-1; result:=copy(s,i1+length(s1),i2-i1-length(s1)); end;
// получаем список валют в XML файле с сайта ЦБ РФ в виде коротких наименований Function GetListValuta(XMLDoc:string):String; var x:integer; ValutaList:TstringList; begin ValutaList:=TstringList.Create; ValutaList.Text:=XMLDoc; result:=''; for X:=0 to ValutaList.count-1 do begin if pos('<CharCode>',ValutaList[x])>0 then result:=result+CopyTextFromTeg(ValutaList[x],'<CharCode>','</CharCode>')+#13+#10; end; ValutaList.free; end;
// получаем курс валюты из XMLDoc:string структуры Function GetKursValutFromCBRF(Valuta:STring;XMLDoc:string):Tvaluta; var ValutaList:TstringList; x:integer; s:string; ValueE,nominalE:Extended; // Валюта разрядность begin ValutaList:=TstringList.Create; ValutaList.text:=XMLDoc; for X:=1 to ValutaList.count-1 do if pos('<CharCode>'+Valuta+'</CharCode>', ValutaList[x])>0 then begin s:=ValutaList[x+1]; nominalE:=StrTofloat(CopyTextFromTeg(s,'<Nominal>','</Nominal>')); s:=ValutaList[x+3]; ValueE:=StrTofloat(CopyTextFromTeg(s,'<Value>','</Value>')); result.Value:=ValueE/nominalE; result.ValutaName:=Valuta; s:=ValutaList[x+2]; result.FullName:=CopyTextFromTeg(s,'<Name>','</Name>'); result.Nominal:=nominalE;