Cum citești rata de schimb de pe site-ul BNR

Păi doar nu cu holbanii, bre. Că asta poate și cotoiu’ meu. Ci în cod, programatic. Adică site-ul tău sau aplicația ta să “citească” și să preia automat rata de schimb de referință din fișierul XML pe care BNR îl pune zilnic la dispoziție.

De două zile mă chinuiec să fac o pagină Web în ASP.NET, cu cod C#, care să preia și să afișeze singură rata de shimb pentru EURo.

Problema?

Acel fișier XML de la BNR are o declarație de namespace cu xmlns. Fără prefix.
<DataSet xmlns="http://www.bnr.ro/xsd&quot; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd">

Interogarea cu XPath a structurii XML se “încurcă” în namespace. Toate exemplele de XPath și XQuery de le-am găsit pe net se refereau la fișiere XML fără declarații de namespace cu prefix gol, iar majoritatea nu aminteau de namespace xmlns deloc.

Și după ce m-am chinuit io ca bivolu’ cu tot felul de încercări, găsesc un articol rătăcit în documentația Windows SDK for .NET Framework. Titlul: XPath Queries and Namespaces. M-a luminat, frate. I-am dat de cap.

Cum a ajuns

Presupunînd că ai o pagină în care e prezent un
<asp:Label ID="lblOneEurValue" runat="server"></asp:Label>

iote și codul din fișierul C#
protected void Page_Load(object sender, EventArgs e)
{
   if (!Page.IsPostBack)
   {
     XPathDocument XML_De_La_BNR = new XPathDocument("http://www.bnro.ro/nbrfxrates.xml&quot;);
     XPathNavigator Navigator_Prin_XML = XML_De_La_BNR.CreateNavigator();

     XmlNamespaceManager Manager_Spatii_De_Nume = new XmlNamespaceManager(Navigator_Prin_XML.NameTable);
     Manager_Spatii_De_Nume.AddNamespace("BNR", "http://www.bnr.ro/xsd&quot;);

     XPathExpression Interogare_XPath_EUR = Navigator_Prin_XML.Compile("/BNR:DataSet/BNR:Body/BNR:Cube/BNR:Rate[@currency=’EUR’]");
     XPathExpression Interogare_XPath_USD = Navigator_Prin_XML.Compile("/BNR:DataSet/BNR:Body/BNR:Cube/BNR:Rate[@currency=’EUR’]");
     Interogare_XPath_EUR.SetContext(Manager_Spatii_De_Nume);
     Interogare_XPath_USD.SetContext(Manager_Spatii_De_Nume);

     XPathNavigator Nod_Rata_EUR = Navigator_Prin_XML.SelectSingleNode(Interogare_XPath_EUR);
     decimal EUR = decimal.Parse(Nod_Rata_EUR.Value.Replace(‘.’, ‘,’));

     lblOneEurValue.Text = EUR.ToString();
   }
}

2 thoughts on “Cum citești rata de schimb de pe site-ul BNR

Lasă un răspuns

Completează mai jos detaliile despre tine sau dă clic pe un icon pentru autentificare:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s