Maison >développement back-end >C++ >Pourquoi SelectSingleNode renvoie-t-il null lorsqu'il s'agit d'espaces de noms XML ?

Pourquoi SelectSingleNode renvoie-t-il null lorsqu'il s'agit d'espaces de noms XML ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-07 21:03:48403parcourir

Why Does SelectSingleNode Return Null When Dealing with XML Namespaces?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn