Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C按属性从XML中选择节点_C#_.net_Xml_Xmlnodelist - Fatal编程技术网

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

C# C按属性从XML中选择节点,c#,.net,xml,xmlnodelist,C#,.net,Xml,Xmlnodelist,我需要能够从EUR=>CHF获得每月每天的货币汇率。因此,我从政府获得了一个XML链接 与XML的链接是 下面是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 Europ

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

与XML的链接是

下面是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>
我不会使用旧的XMLDocumentAPI。下面是使用cleaner 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();
这是一个有效的演示:

您也可以使用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);    
我不会使用旧的XMLDocumentAPI。下面是使用cleaner 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();
这是一个有效的演示:

您也可以使用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);    
我不会使用旧的XMLDocumentAPI。下面是使用cleaner 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();
这是一个有效的演示:

您也可以使用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);    
我不会使用旧的XMLDocumentAPI。下面是使用cleaner 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();
这是一个有效的演示:

您也可以使用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);    

@猜我的记忆生锈了。@CharlesMager:猜我的记忆生锈了。@CharlesMager:猜我的记忆生锈了。@CharlesMager:猜我的记忆生锈了。