2015-02-24 24 views
0

我想讀一些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='2015-02-23'> 
      <Cube currency='USD' rate='1.1298'/> 
      <Cube currency='JPY' rate='134.50'/> 
      <Cube currency='BGN' rate='1.9558'/> 
      <Cube currency='CZK' rate='27.444'/> 
     </Cube> 
    </Cube> 
</gesmes:Envelope> 

我解析這些東西與下面的代碼:

var path = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; 
string xml; 
using (var wc = new WebClient()) 
{ 
    xml = wc.DownloadString(path); 
} 
var xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 
XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable); 
mgr.AddNamespace("n", "http://www.gesmes.org/xml/2002-08-01"); 
1.) XmlNodeList cubes = xmlDoc.SelectNodes("/n:Envelope", mgr); //WORKS 
2.) XmlNodeList cubes = xmlDoc.SelectNodes("/n:Envelope/Cube", mgr); //DOES NOT WORK 

foreach (XmlNode c in cubes) 
{ 
    // whatever 
} 

當我打開Envelope-node(1.),它工作。 但我不知道如何訪問命名空間節點(2.)內的子節點。該代碼運行,但不返回結果。如何訪問?

回答

2

在Envelope-element中聲明瞭默認名稱空間。沒有聲明明確名稱空間的元素的任何後代將具有默認名稱空間。

XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable); 
mgr.AddNamespace("n", "http://www.gesmes.org/xml/2002-08-01"); 
mgr.AddNamespace("d", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"); 
XmlNodeList cubes = xmlDoc.SelectNodes("/n:Envelope/d:Cube", mgr); 

將工作。請注意添加的名稱空間,以便在管理器和xpath中保持默認的名稱空間。如果您檢查的這個結果,你會發現

<Cube xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <Cube time="2015-02-23"> 
     <Cube currency="USD" rate="1.1298" /> 
     <Cube currency="JPY" rate="134.50" /> 
     <Cube currency="BGN" rate="1.9558" /> 
     <Cube currency="CZK" rate="27.444" /> 
    </Cube> 
</Cube> 

其中明確規定有屬於它,這個XML片段,根最外面的立方元素的默認命名空間。

+0

非常感謝。我已經想出了一種不同的方式來讀取XML,但是我對這個簡單的源代碼做了些什麼錯誤的評論。另一方面,我真的很想知道,使用「xmlDoc.SelectNodes(」/ gesmes:Envelope「)」並不是那麼簡單... – Stix 2015-02-24 15:28:38

相關問題