Dépannage SelectSingleNode
Retours nuls dans les documents XML avec espaces de noms
Lorsque vous travaillez avec des documents XML contenant des espaces de noms, l'utilisation de SelectSingleNode
pour rechercher des nœuds spécifiques peut renvoyer de manière inattendue null
. Cela se produit souvent lorsque l'élément cible se trouve dans un espace de noms qui n'est pas explicitement déclaré dans votre expression XPath.
Illustrons avec un exemple :
<code class="language-xml"><?xml version="1.0" encoding="utf-8"?> <project defaulttargets="Build" toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <itemgroup> <compile include="clsWorker.cs"/> </itemgroup> </project></code>
Si vous chargez ce XML dans un XmlDocument
(par exemple, xmldoc
), xmldoc.SelectSingleNode("//Compile")
renverra null
. En effet, l'élément compile
se trouve dans l'espace de noms déclaré par xmlns
. Supprimer l'attribut xmlns
résoudrait le problème, mais ce n'est pas toujours une solution pratique.
La solution : utiliser XmlNamespaceManager
La bonne approche consiste à employer un XmlNamespaceManager
avec SelectSingleNode
. Cela vous permet de spécifier les préfixes d'espace de noms et leurs URI correspondants. Voici comment :
<code class="language-csharp">XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable); ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);</code>
Nous créons un XmlNamespaceManager
, ajoutons un mappage d'espace de noms ("msbld" comme préfixe pour l'URI spécifié), puis utilisons ce gestionnaire dans l'appel SelectSingleNode
. Cela identifie et récupère correctement le nœud compile
. La clé utilise le préfixe msbld:Compile
dans l'expression XPath pour référencer explicitement l'espace de noms.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!