为什么我对Web上的XML文件的XPath请求不起作用?

aba*_*hev 0 .net c# xml xpath web-services

有一个汇率为http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml的XML文件:

<gesmes:Envelope>
  <gesmes:subject>Reference rates</gesmes:subject>
  <gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
  </gesmes:Sender>
  <Cube>
    <Cube time="2009-11-26">
      <Cube currency="USD" rate="1.5071"/>
       ...
Run Code Online (Sandbox Code Playgroud)

我做下一个XPath请求:

var doc = new XmlDocument();
doc.Load(url);
var node = doc.SelectSingleNode("//Cube[@currency=\"USD\""]);
var value = node.Attributes["rate"].Value;
Run Code Online (Sandbox Code Playgroud)

但它又回来了null!我的错误在哪里?

如果我这样做,一切正常:

var node = dic.SelectSingleNode("//*[@currency=\"USD\"]");
var name = node.Name; // "Cube"
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

问题是名称空间.如果您可以使用LINQ to XML,则可以非常轻松地表达此查询.否则,它有点棘手 - 你想要这样的东西:

var doc = new XmlDocument();
doc.Load(url);
XPathNavigator navigator = doc.CreateNavigator();    
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
nsMgr.AddNamespace("ns0", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");

var node = doc.SelectSingleNode("//ns0:Cube[@currency=\"USD\""], nsMgr);
var value = node.Attributes["rate"].Value;
Run Code Online (Sandbox Code Playgroud)

(你并不真的需要在经理那里GESMES命名空间,但它会更容易,如果你需要查找任何其他元素.)

编辑:Peter Murray-Rust的答案在这里是一个不错的选择 - 你采取哪种方法取决于你希望能够找到元素的具体方式.如果您只需要一个查询的命名空间,那么将URI直接包含在XPath中是有意义的; 如果您不仅仅需要它,您将使用命名空间管理器获得更简洁的查询.