从Linq获取Xml中的特定节点

时间:2017-05-11 16:06:04

标签: c# xml linq

我想使用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

1 个答案:

答案 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;

        }
    }

}