c#


Get specific node from Xml usin Linq


I want to get the specific node from my XML response using Linq
My Xml:
<DataSet xmlns="http://www.bnr.ro/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd">
<Header>
<Publisher>National Bank of Romania</Publisher>
<PublishingDate>2016-12-30</PublishingDate>
<MessageType>DR</MessageType>
</Header>
<Body>
<Subject>Reference rates</Subject>
<OrigCurrency>RON</OrigCurrency>
<Cube date="2016-01-04">
<Rate currency="AED">1.1272</Rate>
<Rate currency="EUR">4.5169</Rate>
<Rate currency="BGN">2.3094</Rate>
<Rate currency="HUF" multiplier="100">1.4320</Rate>
<Rate currency="INR">0.0622</Rate>
<Rate currency="JPY" multiplier="100">3.4798</Rate>
<Rate currency="KRW" multiplier="100">0.3481</Rate>
<Rate currency="MDL">0.2107</Rate>
</Cube>
<Cube>
...
</Cube>
</Body>
</DataSet>
So i want to position on the cube which have date equals with a date paramater. Then i want to gate the rate value which has currency equals with "EUR".
I am trying to do this with Linq but it's not working
My Linq code:
WebClient webClient = new WebClient();
string url = "http://www.bnr.ro/files/xml/years/nbrfxrates" + year + ".xml";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
XDocument systemXml = XDocument.Load(response.GetResponseStream());
XElement cube = (from cubeElement in systemXml.Elements("Cube")
where cubeElement.Attribute("date").ToString().Equals(data)
select cubeElement).Single();
XElement rate = (from rateElement in cube.Elements("Rate")
where rateElement.Attribute("currency").ToString().Equals("EUR")
select rateElement).Single();
My problem is that systemXml.Elements("Cube") returns null.
This is my url for web request http://www.bnr.ro/files/xml/years/nbrfxrates2017.xml
It looks like you need the namespace.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication55
{
class Program
{
static void Main(string[] args)
{
string url = "http://www.bnr.ro/files/xml/years/nbrfxrates2017.xml";
XDocument systemXml = XDocument.Load(url);
XNamespace ns = ((XElement)systemXml.FirstNode).GetDefaultNamespace();
DateTime date = DateTime.Parse("2017-01-05");
var results = systemXml.Descendants(ns + "Cube")
.Where(x => ((DateTime)x.Attribute("date") == date))
.Descendants(ns + "Rate")
.Where(x => (string)x.Attribute("currency") == "EUR")
.FirstOrDefault();
var value = (decimal)results;
}
}
}
Your Root element is DataSet,which has childs and one of them is Body,which has childs Cube. Also you need to specify the namespace of the element which is {http://www.bnr.ro/xsd}. So here is working LINQ for you.
XDocument systemXml = XDocument.Load(path);
XElement cube = (from cubeElement in systemXml.Elements("{http://www.bnr.ro/xsd}DataSet").Elements("{http://www.bnr.ro/xsd}Body").Elements("{http://www.bnr.ro/xsd}Cube")
where cubeElement.Attribute("date").Value.Equals("2017-01-03")
select cubeElement).Single();
XElement rate = (from rateElement in cube.Elements("{http://www.bnr.ro/xsd}Rate")
where rateElement.Attribute("currency").Value.Equals("EUR")
select rateElement).Single();
Enjoy it!!

Related Links

caching a page with data from database asp.net
Web API 2 - restful service - URL encoded
Can't print out text from textbox with threads.
Detect slow running SQL query in C# code behind
Animating BorderBrush from DynamicResource animates everything using that brush
Print out the numbers among 1 and 200 that can be divisible by 13
Is there a design pattern to avoid this repetition or reflection?
Is it possible to print from local pc default printer?
Hiding Columns in RDLC (selecting Header and Value Textbox individually) leaves whitespace
How to get an element from list of list
UserControl - DependencyProperty- default values in the MainWindow?
WPF layout created dynamically using MVVM
Should I abort & join threads before exiting the main form? [duplicate]
Button click event not fired after upgrading to Sitecore 7.2
Where command, XML Feed Windows phone 8
Window CE 4.2 - Enumerating through the controls of a different running process

Categories

HOME
actionscript-3
airflow
url
intellij-idea
window.open
sms
schema
kairosdb
tag-cloud
alert
airbnb
glibc
gomobile
monad-transformers
formulas
typedef
opengraph
ballerinalang
eclipse-jdt
imageprocessor
iterm2
mediastream
usernotifications
observer-pattern
vertical-alignment
html-entities
hierarchical-clustering
monaca
beanshell
visualizer
seyren
androiddesignsupport
liferay-ide
totalview
petapoco
overhead
codesniffer
glade
easy68k
gdi
video-embedding
computability
gitk
personality-insights
android-togglebutton
jsoncpp
autoscaling
asp.net-2.0
chrome-mobile
crtdbg.h
random-access
system.io.packaging
clearcanvas
selenium-grid2
time-frequency
webshim
new-operator
git-subtree
mongoid4
flask-mongoengine
xtify
ekevent
mysql-error-1146
lastinsertid
infomaker
zend-db-table
auctex
scsf
functional-specifications
quazip
pitch-shifting
mysql-logic
zend-acl
onresize

Resources

Encrypt Message