Подтвердить что ты не робот

Проблема XmlDocument.SelectSingleNode и xmlNamespace

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

4b9b3361

Ответ 1

Вы должны использовать 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);

Ответ 2

Взято справа от документации SelectSingleNode() на MSDN:

Примечание
Если выражение XPath не содержит префикс, предполагается, что URI пространства имен - пустое пространство имен. Если ваш XML содержит значение по умолчанию пространства имен, вы все равно должны добавить URI префикса и пространства имен в XmlNamespaceManager; в противном случае вы не выберете node.. Дополнительная информация, см. Выбор узлов с помощью XPath Navigation.

И сразу следующий образец кода

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

Это не как если this .; -)

Ответ 3

Поскольку "ItemGroup" может иметь несколько дочерних элементов "Compile", и вы специально хотите "компилировать" дочерние элементы "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: 'должна предшествовать каждому уровню node.