2015-02-24 58 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

相关问题