Dzięki temu linkowi, będziemy znali aktualne kursy NBP, po których będziemy mogli dokonywać przeliczeń pomiędzy walutami po aktualnym kursie wg. NBP. Aby nieco uprościć całą sprawę, napisałem metodę, która pobiera zawartość tego pliku i udostępnia kursy w bardziej przystępnej, obiektowej formie. Mając tą metodę, możemy później napisać "timer job" (sharepoint timer job, lub aplikację konsolową uruchamianą za pomocą Windows Task Scheduler), który będzie umieszczał zawartość tego pliku w bazie danych, liście sharepointa, czy gdzie tylko chcemy.
Metoda, która pobiera aktualny kurs wygląda tak:
private static List<Currency> ImportData(string url)Jako parametr podajemy adres url do pliku XML z listą walut. Wykorzystano parametr, ponieważ NBP wystawia kilka, różnych plików XML z aktualnymi kursami walut (LastA.xml, LastB.xml, LastC.xml) w zależności od tego, ile i które waluty nam są potrzebne korzystamy z odpowiedniego linku (LastA.xml podany w aplikacji pobiera 37 najpopularniejszych walut).
{
// Creates an HttpWebRequest with the specified URL.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
// Sends the HttpWebRequest and waits for the response.
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
// Gets the stream associated with the response.
Stream receiveStream = myHttpWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("iso-8859-2");
// Pipes the stream to a higher level stream reader with the required encoding format.
StreamReader readStream = new StreamReader(receiveStream, encode);
string readedData = readStream.ReadToEnd();
myHttpWebResponse.Close();
// Releases the resources of the Stream.
readStream.Close();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(readedData);
XmlNodeList currencyListXml = xmlDoc.GetElementsByTagName(Constraints.POSITION);
var date = xmlDoc.GetElementsByTagName(Constraints.PUBLICATION_DATE);
DateTime currencyDate = Convert.ToDateTime(date[0].FirstChild.Value);
List<Currency> currencyList = new List<Currency>();
foreach (XmlNode currencyXml in currencyListXml)
{
//XmlNodeList nodes = currencyXml.ChildNodes;
Currency currency = new Currency();
currency.CurrencyName = currencyXml.ChildNodes[0].FirstChild.Value;
currency.Converter = currencyXml.ChildNodes[1].FirstChild.Value;
currency.CurrencyCode = currencyXml.ChildNodes[2].FirstChild.Value;
currency.CurrencyRate = Convert.ToDouble(currencyXml.ChildNodes[3].FirstChild.Value);
currency.CurrencyDate = currencyDate;
currencyList.Add(currency);
}
return currencyList;
}
Sama metoda, nie jest zbyt skomplikowana. Podajemy na wejście adres url, nast. za pomocą obiektów HttpWebRequest oraz HttpWebResponse pobieramy zawartość w pliku XML jako stream. Następnie tworzymy z niego XmlDocument, z którego po kolei wydobywamy interesujące nas dane i przekazujemy je do obiektów stworzonej przez nas klasy 'Currency'. Na zakończenie metoda zwraca listę obiektów 'Currency', na której to później dużo łatwiej jest nam operować.
Przykładowy program, który pobiera aktualne kursy walut, a nast. wyświetla je na konsoli wygląda następująco:
using System;P.S. Zasady korzystania z danych publikowanych na stronie NBP można znaleźć w statusie serwisu pod tym adresem.
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;
namespace GetAcctualNBPCurrency
{
class Program
{
static void Main(string[] args)
{
string url = @"http://www.nbp.pl/kursy/xml/LastA.xml";
List<Currency> currencyList = ImportData(url);
foreach (Currency currency in currencyList)
{
Console.WriteLine("Kurs dla waluty {0} ({1}) na dzień {2} wynosi: {3}", currency.CurrencyCode, currency.CurrencyName, currency.CurrencyDate.ToShortDateString(), currency.CurrencyRate);
}
Console.ReadKey();
}
private static List<Currency> ImportData(string url)
{
// Creates an HttpWebRequest with the specified URL.
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
// Sends the HttpWebRequest and waits for the response.
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
// Gets the stream associated with the response.
Stream receiveStream = myHttpWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("iso-8859-2");
// Pipes the stream to a higher level stream reader with the required encoding format.
StreamReader readStream = new StreamReader(receiveStream, encode);
string readedData = readStream.ReadToEnd();
myHttpWebResponse.Close();
// Releases the resources of the Stream.
readStream.Close();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(readedData);
XmlNodeList currencyListXml = xmlDoc.GetElementsByTagName(Constraints.POSITION);
var date = xmlDoc.GetElementsByTagName(Constraints.PUBLICATION_DATE);
DateTime currencyDate = Convert.ToDateTime(date[0].FirstChild.Value);
List<Currency> currencyList = new List<Currency>();
foreach (XmlNode currencyXml in currencyListXml)
{
//XmlNodeList nodes = currencyXml.ChildNodes;
Currency currency = new Currency();
currency.CurrencyName = currencyXml.ChildNodes[0].FirstChild.Value;
currency.Converter = currencyXml.ChildNodes[1].FirstChild.Value;
currency.CurrencyCode = currencyXml.ChildNodes[2].FirstChild.Value;
currency.CurrencyRate = Convert.ToDouble(currencyXml.ChildNodes[3].FirstChild.Value);
currency.CurrencyDate = currencyDate;
currencyList.Add(currency);
}
return currencyList;
}
}
class Currency
{
public string CurrencyName { get; set; }
public string Converter { get; set; }
public string CurrencyCode { get; set; }
public double CurrencyRate { get; set; }
public DateTime CurrencyDate { get; set; }
public Currency() { }
}
class Constraints
{
public static readonly string PUBLICATION_DATE = "data_publikacji";
public static readonly string POSITION = "pozycja";
public static readonly string CURRENCY_NAME = "nazwa_waluty";
public static readonly string CONVERETER = "przelicznik";
public static readonly string CURRENCY_CODE = "kod_waluty";
public static readonly string CURRENCY_RATE = "kurs_sredni";
}
}
Gdyby okazało się, że nie można wyświetlić liter: ś,Ś,ą,Ą to można użyć kodowania: windows-1250
OdpowiedzUsuńNo taki wpis mi się podoba, kompleksowo i na temat
OdpowiedzUsuńTylko ciekawe że pobierane waluty 15-11-2013 niektóre mają datę 13-11-2013 ciekwe...
OdpowiedzUsuńTen komentarz został usunięty przez autora.
UsuńSpojrzałem na stronę: http://www.nbp.pl/home.aspx?f=/statystyka/kursy.html i tam na dole strony jest napisane:
UsuńInformacja o terminach publikacji kursów walut NBP
Tabela A kursów średnich walut obcych aktualizowana jest na stronie internetowej NBP w każdy dzień roboczy, pomiędzy godziną 11:45 a godziną 12:15.
Tabela B kursów średnich walut obcych aktualizowana jest na stronie internetowej NBP w każdą środę, pomiędzy godziną 11:45 a godziną 12:15.
Tabela C kursów kupna i sprzedaży walut obcych oraz tabela kursów jednostek rozliczeniowych aktualizowane są na stronie internetowej NBP w każdy dzień roboczy, pomiędzy godziną 7:45 a godziną 8:15.
Dostępne na stronie internetowej NBP pliki (w postaci xls) z archiwalnymi kursami walut (Tabela A, Tabela C, kursy średnie miesięczne, kursy na koniec miesiąca, średnie roczne oraz średnioważone kursy złotego w stosunku do walut obcych) aktualizowane są w każdy pierwszy roboczy dzień miesiąca do godz. 16:00. Kursy archiwalne (Tabela B) aktualizowane są dwa razy w roku: na początku stycznia i lipca.