2010-08-01 185 views
1

所以我有一个看起来像这样的XML文档:
的SelectSingleNode返回null

<?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文档。假设我需要通过调用SelectSingleNode(string xpath)方法来获得<Cube currency=USD" rate="1.2384"/>节点中rate属性的值。

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

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在此处设置为空。我检查了timeNode,它指向正确的节点,所以我想问题是在SelectSingleNode方法中的路径,但我无法看到问题出在哪里。我检查了其他类似问题的帖子,但找不到任何可以解决地雷问题的帖子。任何指针将不胜感激。

回答

1

默认情况下,XML属性没有名称空间,所以您不需要在它们上使用名称空间前缀。尽量只:

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

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

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

谢谢。完美工作。属性名称空间上的大指针,我不知道。 – 2010-08-01 13:29:32

2

更改您的XPath到

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

嗯,当我添加我的答案类似的答案被张贴:(。 – YoK 2010-08-01 13:34:58