XmlDocument.SelectSingleNode和xmlNamespace问题

我将一个string加载到包含以下结构的XML文档中:

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Compile Include="clsWorker.cs" /> </ItemGroup> </Project> 

然后im全部加载到xmldocument:

 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(Xml); 

那么会出现以下问题:

 XmlNode Node = xmldoc.SelectSingleNode("//Compile"); // return null 

当我从根元素(项目)中删除xmlns属性工作正常,我怎么能改善我的SelectSingleNode返回相关的元素?

您应该在调用SelectSingleNode()时使用XmlNamespaceManager :

 XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable); ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns); 

从MSDN上SelectSingleNode()的文档中取出:

注意
如果XPathexpression式不包含前缀,则假定名称空间URI是空的名称空间。 如果您的XML包含一个默认名称空间,那么您仍然必须将一个前缀和名称空间URI添加到XmlNamespaceManager; 否则,你将不会得到一个select的节点。 有关更多信息,请参阅使用XPath导航select节点 。

紧接着的示例代码是

 XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com"); XmlNode book = doc.SelectSingleNode("//ab:book", nsmgr); 

这 不是 好像 这 是 “ 隐藏的 知识 ”。 😉

由于'ItemGroup'可能有多个'Compile'子元素,而你特别需要'Project / ItemGroup'的'Compile'子元素,下面的代码将返回所有'Compile'子元素:

 XmlDocument projectDoc = new XmlDocument(); projectDoc.Load(projectDocPath); XmlNamespaceManager ns = new XmlNamespaceManager(projectDoc.NameTable); ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlNodeList xnList = projectDoc.SelectNodes(@"/msbld:Project/msbld:ItemGroup/msbld:Compile", ns); 

请注意,'msbld:'命名空间规范需要在每个节点级别之前。