C# Select 来自 XML 的节点(按属性)
C# Select Node from XML by Attribute
我需要能够从 EUR => CHF 获取一个月中每一天的货币汇率。因此我从政府那里得到了 XML Link
带XML的Link是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;
}
我不会使用旧的 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);
我需要能够从 EUR => CHF 获取一个月中每一天的货币汇率。因此我从政府那里得到了 XML Link
带XML的Link是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;
}
我不会使用旧的 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);