C#按属性从XML中选择节点

时间:2015-08-13 09:23:55

标签: c# .net xml xmlnodelist

我需要能够从EUR =>获得货币汇率。一个月中每天的瑞士法郎。因此,我从政府获得了一个XML链接。

与XML的链接是this one

以下是XML的摘录:

<devise code="eur">
  <land_de>Europäische Währungsunion</land_de>
  <land_fr>Union monétaire européenne</land_fr>
  <land_it>Unione Monetaria Europea</land_it>
  <land_en>Euro Member</land_en>
  <waehrung>1 EUR</waehrung>
  <kurs>1.05222</kurs>
</devise>
<devise code="gbp">
  <land_de>Grossbritannien</land_de>
  <land_fr>Grande-Bretagne</land_fr>
  <land_it>Gran Bretagna</land_it>
  <land_en>United Kingdom</land_en>
  <waehrung>1 GBP</waehrung>
  <kurs>1.48298</kurs>
</devise>

我需要从EUR节点(这是货币兑换)获得值“1.05222”。

我尝试了以下代码,但它不起作用,结果始终为空。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(url);

string kurs="";

XmlNodeList xnList = xmlDoc.SelectNodes("/wechselkurse/devise[@code='eur']");
foreach (XmlNode xn in xnList)
{
   kurs = xn["kurs"].InnerText;
}

1 个答案:

答案 0 :(得分:3)

我不会使用旧的XmlDocument API。以下是使用更清晰的LINQ to XML API的方法:

XNamespace ns = "http://www.afd.admin.ch/publicdb/newdb/mwst_kurse";

var doc = XDocument.Load("http://www.afd.admin.ch/publicdb/newdb/mwst_kurse/wechselkurse.php?d=20150701");

var eur = doc.Descendants(ns + "devise")
    .Where(e => (string)e.Attribute("code") == "eur")
    .Select(e => (decimal)e.Element(ns + "kurs"))
    .Single();

这是一个有效的演示:https://dotnetfiddle.net/Iz6NHO

您也可以使用XPath(尽管由于静态类型,查询方法通常更可取)。查询的唯一问题是您需要考虑命名空间:

var nsm = new XmlNamespaceManager(new NameTable());

nsm.AddNamespace("k", "http://www.afd.admin.ch/publicdb/newdb/mwst_kurse");

var eur = (decimal)doc.XPathSelectElement("/k:wechselkurse/k:devise[@code='eur']/k:kurs", nsm);