53

我正在将一个字符串加载到一个包含以下结构的 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>

然后我将所有内容加载到XmlDocument

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

然后出现以下问题:

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

当我xmlns从根元素 ( Project) 中删除该属性时,它工作正常。

我如何才能SelectSingleNode返回相关元素?

4

4 回答 4

97

您应该在调用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);
于 2010-11-13T07:32:06.813 回答
24

取自MSDN 上的文档SelectSingleNode()

注意
如果 XPath 表达式不包含前缀,则假定名称空间 URI 是空名称空间。如果您的 XML 包含默认命名空间,您仍必须向 XmlNamespaceManager 添加前缀和命名空间 URI;否则,您将无法选择节点。有关详细信息,请参阅使用 XPath 导航选择节点

紧随其后的示例代码是

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

不像 隐藏知识_ _ ;-)

于 2010-11-13T07:32:12.613 回答
7

这样你就不需要指定命名空间:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'Compile']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);
于 2018-02-14T10:15:49.663 回答
3

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

于 2016-06-14T15:37:36.600 回答