c# примеры пример - Проблема XmlDocument.SelectSingleNode и xmlNamespace




2 Answers

Вы должны использовать XmlNamespaceManager в своем вызове SelectSingleNode() :

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

Я загружаю строку в 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 из корневого элемента (Project) его работу отлично, как я могу улучшить свой SelectSingleNode, чтобы вернуть соответствующий элемент?




Поскольку «ItemGroup» может иметь несколько «компиляционных» дочерних элементов, и вы специально хотите «компилировать» дочерние элементы «Project / ItemGroup», следующие возвращают все нужные «компилируемые» дети и другие:

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: 'должна предшествовать каждому уровню узла.




Related