2010-08-01 110 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