【发布时间】:2011-07-09 13:37:41
【问题描述】:
拥有一个 XML 文档,我想获取具有特定名称的第一个节点,无论它包含在哪个嵌套深度中。
我尝试了几件事但没有成功:
var node1 = doc.SelectSingleNode(@"//Shortcut");
var node2 = doc.SelectSingleNode(@"/*/Shortcut");
var node3 = doc.SelectSingleNode(@"//*/Shortcut");
var node4 = doc.SelectSingleNode(@"*/Shortcut");
...
每次调用都会产生一个NULL 节点。
我认为它应该是一些简单的 XPath 语法。你能帮帮我吗?
(如果这很重要:XML 文档是 WiX 项目的输入文件,因此可能涉及一些命名空间问题?!?)。
编辑
我还尝试了以下方法:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace(string.Empty, @"http://schemas.microsoft.com/wix/2006/wi");
nsm.AddNamespace(@"ns", @"http://schemas.microsoft.com/wix/2006/wi");
与:
var node1 = doc.SelectSingleNode(@"//Shortcut", nsm);
var node2 = doc.SelectSingleNode(@"/*/Shortcut", nsm);
var node3 = doc.SelectSingleNode(@"//*/Shortcut", nsm);
var node4 = doc.SelectSingleNode(@"*/Shortcut", nsm);
...
导致相同的结果。
编辑 2 - 解决方案
我找到了解决办法:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace(string.Empty, @"http://schemas.microsoft.com/wix/2006/wi");
nsm.AddNamespace(@"ns", @"http://schemas.microsoft.com/wix/2006/wi");
然后
var node1 = doc.SelectSingleNode(@"//ns:Shortcut", nsm);
这成功了。
【问题讨论】:
-
好问题,+1。请参阅我的答案以获得更通用和灵活的解决方案。