SelectSingleNode返回null

时间:2010-08-01 13:10:32

标签: 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</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>

现在假设我有XmlNode timeNode指向<Cube time="2010-05-28">节点,document指向加载的XML文档。假设我需要通过调用rate方法获取<Cube currency=USD" rate="1.2384"/>节点中SelectSingleNode(string xpath)属性的值。

到目前为止,我能够提出这个代码:

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


XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@ecb:currency='USD']", nsmgr);

string rate = currencyNode.Attributes.GetNamedItem("rate").Value;

这里的问题是currencyNode在这里设置为null。我已经检查了timeNode并且它指向了正确的节点,所以我猜问题是SelectSingleNode方法中的路径,但我没有看到问题所在。我已经检查了其他类似问题的帖子,但找不到任何可以解决地雷问题的帖子。任何指针都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

将xpath更改为

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

答案 1 :(得分:1)

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

XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@currency='USD']", nsmgr);

你也不需要在这里明确指定后代轴,因为它默认会查看子项,所以你也可以将它缩短为:

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