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:'命名空间规范需要在每个节点级别之前。