C# SelectSingleNode返回null

C# SelectSingleNode返回null,c#,xml,selectsinglenode,C#,Xml,Selectsinglenode,所以我有一个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</gesme

所以我有一个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="2010-05-28">
           <Cube currency="USD" rate="1.2384"/>
           <Cube currency="JPY" rate="113.06"/>
       </Cube>
       <Cube time="2010-05-27">
           <Cube currency="USD" rate="1.2255"/>
           <Cube currency="JPY" rate="110.79"/>
       </Cube>
   </Cube>
</gesmes:Envelope>

这里的问题是
currencyNode
在这里设置为null。我已经检查了
timeNode
,它指向了正确的节点,因此我猜问题出在
SelectSingleNode
方法中的路径,但我看不出问题出在哪里。我检查过其他有类似问题的帖子,但没有找到任何解决问题的方法。任何指针都将受到欢迎。

默认情况下,XML属性没有名称空间,因此不需要在它们上使用名称空间前缀。试试看:

XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@currency='USD']", nsmgr);
您也不需要在此处显式指定子体轴,因为默认情况下它将查看子体,因此您也可以将其缩短为:

XmlNode currencyNode = timeNode.SelectSingleNode("ecb:Cube[@currency='USD']", nsmgr);
将xpath更改为

descendant::ecb:Cube[@currency="USD"]

谢谢工作得很好。属性名称空间上的指针很棒,我在添加我的答案时不知道.hmmm,发布了类似的答案:(。
descendant::ecb:Cube[@currency="USD"]