c#中的xpath查询引发异常

c#中的xpath查询引发异常,c#,xml,xpath,C#,Xml,Xpath,我试图从以下xml中提取信息: 很好用! 但是,就我所知,什么不起作用,xpath语法是正确的: var z = doc.SelectSingleNode("//Cube[@currency='JPY']/@rate"); labelResult.Text = z.Value; 我得到一个例外:“对象引用未设置为对象的实例”。 据我所知,我没有从我的查询中得到任何数据,这很奇怪,因为我很确定它是正确的。谢谢你的帮助 您缺少xml文件具有名称空间的事实。以下是如何将它们包括在查询中: XmlDo

我试图从以下xml中提取信息:

很好用! 但是,就我所知,什么不起作用,xpath语法是正确的:

var z = doc.SelectSingleNode("//Cube[@currency='JPY']/@rate");
labelResult.Text = z.Value;
我得到一个例外:“对象引用未设置为对象的实例”。
据我所知,我没有从我的查询中得到任何数据,这很奇怪,因为我很确定它是正确的。谢谢你的帮助

您缺少xml文件具有名称空间的事实。以下是如何将它们包括在查询中:

XmlDocument doc = new XmlDocument();

doc.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

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

var z = doc.SelectSingleNode("//gesmes:Cube[@currency='JPY']/@rate", xmlnsManager);

您的第一个查询可以工作,因为名称空间不适用于属性。

在尝试从z中获取值之前,z中是什么。如果为空,那么这就是问题所在。您没有从上一条语句返回的节点。此外,除非必须,否则不要使用var。i、 e.类型名称是来自LINQ结果的冗长名称,或者是匿名类型(在这种情况下,您别无选择)。否则,正是懒惰降低了代码的可读性。z此时此地被声明,应该是XMLNode,因为这是SelectSingleNode返回的类型。如果它确实如您所建议的那样是空的,那么我的xpath查询有什么问题吗?thx man,它立即修复了它。名称空间不适用于属性,可能需要仔细阅读。干杯
XmlDocument doc = new XmlDocument();

doc.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

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

var z = doc.SelectSingleNode("//gesmes:Cube[@currency='JPY']/@rate", xmlnsManager);