在C#中读取远程XML

时间:2011-07-27 14:00:45

标签: c# asp.net xml

我正在读取远程XML文件,一旦将XML加载到XMLDocument对象中,我需要遍历它并提取应用程序所需的值。我的代码如下:

    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");

    XmlNamespaceManager nsMan = new XmlNamespaceManager(xmlDocument.NameTable);
    nsMan.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
    nsMan.AddNamespace("", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");


    XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("/gesmes:Envelope/Cube/Cube/Cube", nsMan);

    HttpContext.Current.Response.Write("The numner of nodes is " + xmlNodeList.Count); //it's always zero

然而,我得到的问题是XmlNodeList总是返回零节点,而如果我在XMLSpy中评估XPath表达式,我得到了我需要的节点。

作为参考,XML看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
    <Cube time='2011-07-27'>
        <Cube currency='USD' rate='1.4446'/>
        <Cube currency='GBP' rate='0.88310'/>
    </Cube>
</Cube>
</gesmes:Envelope>

我想返回美元和英镑的Cube节点。

你聪明的人有什么想法吗?

由于 人

1 个答案:

答案 0 :(得分:13)

虽然您明确可以使用XmlDocument API中的命名空间和XPath,但我强烈建议您使用LINQ to XML(.NET 3.5)如果可能的话:

string url = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml";
XDocument doc = XDocument.Load(url);

XNamespace gesmes = "http://www.gesmes.org/xml/2002-08-01";
XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref";

var cubes = doc.Descendants(ns + "Cube")
               .Where(x => x.Attribute("currency") != null)
               .Select(x => new { Currency = (string) x.Attribute("currency"),
                                  Rate = (decimal) x.Attribute("rate") });

foreach (var result in cubes)
{
    Console.WriteLine("{0}: {1}", result.Currency, result.Rate);
}