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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top