• Главная
  • Карта сайта
Не найдено

Як отримати курс валюти засобами C #

Одному з наших нових корпоративних сервіси можуть бути доступні регулярно отримувати актуальний курс валюти. Нас цікавлять євро і долари, особливо зараз, коли курс став різко скакати. Щоб встигати за оновленнями і звільнити вічно зайнятих співробітників від цієї рутиною операції, було вирішено автоматизувати цей процес. На щастя, вихідний код проекту у нас є.

Особливої ​​часу на вирішення цього завдання не було, і я сподівався, що в мережі знайдеться готовий сніпет, здатний вирішити проблему за пару хвилин. На жаль, ні до чого хорошого мої пошуки не привели. Варіанти, що потрапили під пильне око Google, демонстрували банальний аналіз сторінки центрального банку з переліком всіх доступних курсів валют за допомогою регулярного виразу. Не знаю, навіщо автори цих рішень мучилися з регулярними виразами, якщо сайт центрального банку завжди радий віддати необхідну інформацію у вигляді XML / SOAP.

Варіант з SOAP мені здався більш витратним (за часом), тому було вирішено отримувати всі необхідні дані в XML. Для цього потрібно зробити GET запит за адресою http://www.cbr.ru/scripts/XML_daily.asp . Відповіддю буде готовий для аналізу XML, що містить інформацію про курси різних валют (на поточну дату). Шматок такого XML наводжу нижче:

<ValCurs Date = "18.03.2014" name = "Foreign Currency Market"> <Valute ID = "R01010"> <NumCode> 036 </ NumCode> <CharCode> AUD </ CharCode> <Nominal> 1 </ Nominal> < Name> Австралійський долар </ Name> <Value> 33,2054 </ Value> </ Valute> <Valute ID = "R01020A"> <NumCode> 944 </ NumCode> <CharCode> AZN </ CharCode> <Nominal> 1 </ Nominal> <Name> Азербайджанський манат </ Name> <Value> 46,7958 </ Value> </ Valute> <Valute ID = "R01035"> <NumCode> 826 </ NumCode> <CharCode> GBP </ CharCode > <Nominal> 1 </ Nominal> <Name> Фунт стерлінгів Сполученого королівства </ Name> <Value> 60,9791 </ Value> </ Valute> <Valute ID = "R01060"> <NumCode> 051 </ NumCode> <CharCode> AMD </ CharCode> <Nominal> 1000 </ Nominal> <Name> вірменських драмів </ Name> <Value> 88,2613 </ Value> </ Valute> <Valute ID = "R01090"> <NumCode> 974 </ NumCode> <CharCode> BYR </ CharCode> <Nominal> 10000 </ Nominal> <Name> Білоруських рублів </ Name> <Value> 37,2654 </ Value> </ Valute>

Вирішити завдання отримання курсу засобами C # досить просто. Можливо, це не зовсім оптимальне рішення (я поки не вважаю себе експертом в .NET), але воно працює спритно і прекрасно виконує поставлене завдання. Розбирати XML я вирішив за допомогою класу XmlTextReader. Ось що у мене вийшло:

using System.Xml; // ініціалізувавши об'єкта типу XmlTextReader і // завантажуємо XML документ з сайту центрального банку XmlTextReader reader = new XmlTextReader ( "http://www.cbr.ru/scripts/XML_daily.asp"); // У ці змінні будемо зберігати шматки XML // з певними валютами (Euro, USD) string USDXml = ""; string EuroXML = ""; // Перебираємо всі вузли в завантаженому документі while (reader.Read ()) {// Перевіряємо тип поточного вузла switch (reader.NodeType) {// Якщо цього елемент Valute, то починаємо аналізувати атрибути case XmlNodeType.Element: if (reader. Name == "Valute") {if (reader.HasAttributes) {// Метод пересуває покажчик до наступного атрибуту while (reader.MoveToNextAttribute ()) {if (reader.Name == "ID") {// Якщо значення атрибута дорівнює R01235, то перед нами інформація про курс долара if (reader.Value == "R01235") {// Повертаємося до елементу, що містить поточний вузол атрибута reader.MoveToElement (); // Прочитуємо вміст дочірніх вузлом USDXml = reader.ReadOuterXml (); }} // Аналогічну процедуру робимо для ЄВРО if (reader.Name == "ID") {if (reader.Value == "R01239") {reader.MoveToElement (); EuroXML = reader.ReadOuterXml (); }}}}} Break; }} // З висмикнутих шматків XML коду створюємо нові XML документи XmlDocument usdXmlDocument = new XmlDocument (); usdXmlDocument.LoadXml (USDXml); XmlDocument euroXmlDocument = new XmlDocument (); euroXmlDocument.LoadXml (EuroXML); // Метод повертає вузол, відповідний виразу XPath XmlNode xmlNode = usdXmlDocument.SelectSingleNode ( "Valute / Value"); // Прочитуємо значення і конвертуємо в decimal. Курс валют отриманий decimal usdValue = Convert.ToDecimal (xmlNode.InnerText); xmlNode = euroXmlDocument.SelectSingleNode ( "Valute / Value"); decimal euroValue = Convert.ToDecimal (xmlNode.InnerText);

В принципі, можна було обійтися засобами одного XmlTextReader, але тоді код вийшов би більш складним для сприйняття. Довелося б працювати з елементами послідовно і зберігати проміжні значення для подальшого аналізу. Змішаний підхід дозволив позбутися від надмірностей.

До речі, цю ж задачу реально вирішити за допомогою одного класу XmlDocument. XML файл з інформацією про курси валют невеликого розміру, тому використання XmlDocument цілком виправдано. Для великих файлів XmlDocument не підходить, тому що всі дані з файлу відразу ж завантажуються в пам'ять і її елементарно може не вистачити.

Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью