Pourquoi SelectSingleNode renvoie-t-il la valeur null?
-
03-07-2019 - |
Question
Je travaille avec un document XML contenant une structure semblable à celle-ci:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
Je charge actuellement cela depuis un fichier dans un document XML de la manière suivante:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Cependant, je rencontre un problème et uniquement avec ce document lorsque j'essaie d'exécuter la ligne de code suivante:
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
Suis-je sur la bonne voie en devinant qu'il renvoie null en raison d'un problème lié à l'utilisation d'un attribut nommé "id" ou manque-t-il quelque chose dans le code?
La solution
Je ne peux pas répliquer cela à l'aide d'un fichier XML
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
Et le code
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
Ceci renvoie un nœud non nul comme prévu.
Mettre à jour
Après avoir ajouté un élément xmlns="example.org"
à l'élément <MT>
, je devais configurer un gestionnaire d'espaces de noms pour XPath et utiliser l'espace de noms pour l'événement. Impossible que l'espace de nom par défaut fonctionne pour une raison quelconque.
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");
XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);
Une chose m'a confondu lorsque j'essayais de faire en sorte que cela fonctionne. Pourquoi XmlNamespaceManager a-t-il besoin de XmlNameTable à partir du document si ce n'est pour trouver les espaces de noms qu'il contient? Au lieu de cela, pourquoi dois-je définir les tables NameTable et ? Je serais reconnaissant si quelqu'un qui sait pouvait laisser un petit commentaire.