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




xpath xml c# example (3)

Взятый справа от SelectSingleNode() :

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

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

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

It's not as if this would « hidden knowledge ». ;-)

https://code.i-harness.com

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


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

Таким образом, вам не нужно указывать пространство имен:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'Compile']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);