Question

Je suis le chargement d'une chaîne à un document XML qui contient la structure suivante:

<?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>

puis chargement im tout en XmlDocument:

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

le problème suivant se produit:

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

quand je supprime l'attribut xmlns de l'élément racine (projet) son beau travail, Comment puis-je améliorer mon SelectSingleNode retourner l'élément pertinent?

Était-ce utile?

La solution

Vous devez utiliser un XmlNamespaceManager dans votre appel à SelectSingleNode () :

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

Autres conseils

puisée au documentation de SelectSingleNode() sur le MSDN :

  

Remarque   Si l'expression XPath ne comprend pas un préfixe, on suppose que la   URI d'espace est l'espace de noms vide. Si votre XML comprend un défaut   espace de noms, vous devez toujours ajouter un préfixe et espace de nom URI à la   XmlNamespaceManager; sinon, vous ne serez pas un nœud sélectionné.   plus d'informations, consultez Sélectionnez nœuds à l'aide XPath de navigation .

Et le code suivant immédiatement l'échantillon est

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

Il est pas comme href="https://stackoverflow.com/questions/809496/why-is-selectsinglenode-returning-null"> si cette serait être " caché connaissances ». ; -)

Depuis les enfants « ItemGroup » peut avoir plusieurs données de compilation des enfants, et que vous voulez précisément le «Compile des enfants du « Projet / ItemGroup », ce qui suit retournera tous les choix « Compile » et pas d'autres:

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);

Notez que les « msbld: ». Besoins de spécification d'espace de noms pour précéder chaque niveau de noeud

De cette façon, vous n'avez pas besoin de spécifier l'espace de noms:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'Compile']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top