我想使用Linq从我的XML响应中获取特定节点 我的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>
所以我想在具有日期等于日期参数的立方体上定位。然后我想关闭货币等于“EUR”的利率值。 我试图用Linq做这件事,但它没有用 我的Linq代码:
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();
我的问题是systemXml.Elements("Cube")
返回null
。
这是我的网址请求网址http://www.bnr.ro/files/xml/years/nbrfxrates2017.xml
答案 0 :(得分:1)
看起来你需要命名空间。
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;
}
}
}