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)
问题是名称空间.如果您可以使用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中是有意义的; 如果您不仅仅需要它,您将使用命名空间管理器获得更简洁的查询.
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |