2010-08-01 11 views
1

j'ai donc un document XML qui ressemble à ceci:
retourne SelectSingleNode null

<?xml version="1.0" encoding="UTF-8"?> 
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <gesmes:subject>Reference rates</gesmes:subject> 
    <gesmes:Sender> 
     <gesmes:name>European Central Bank</gesmes:name> 
    </gesmes:Sender> 
    <Cube> 
     <Cube time="2010-05-28"> 
      <Cube currency="USD" rate="1.2384"/> 
      <Cube currency="JPY" rate="113.06"/> 
     </Cube> 
     <Cube time="2010-05-27"> 
      <Cube currency="USD" rate="1.2255"/> 
      <Cube currency="JPY" rate="110.79"/> 
     </Cube> 
    </Cube> 
</gesmes:Envelope> 

Supposons maintenant que j'ai un XmlNode timeNode qui pointe vers <Cube time="2010-05-28"> noeud et un document qui pointe vers le document XML chargé. Disons que j'ai besoin d'obtenir la valeur de l'attribut rate dans le nœud <Cube currency=USD" rate="1.2384"/> en appelant une méthode SelectSingleNode(string xpath).

Jusqu'à présent, j'ai pu venir avec ce code:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable); 
nsmgr.AddNamespace("ecb", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"); 
nsmgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01"); 


XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@ecb:currency='USD']", nsmgr); 

string rate = currencyNode.Attributes.GetNamedItem("rate").Value; 

Le problème ici est que currencyNode est réglé sur null ici. J'ai vérifié le timeNode et il pointe vers le bon noeud, donc je suppose que le problème est avec le chemin dans la méthode SelectSingleNode, mais je ne vois pas où est le problème. J'ai vérifié d'autres messages avec le même problème mais je n'ai rien trouvé qui puisse résoudre les mines. Tout pointeur sera apprécié.

Répondre

1

Les attributs XML ne possèdent pas d'espace de noms par défaut, vous n'avez donc pas besoin d'utiliser le préfixe d'espace de noms. Essayez simplement:

XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@currency='USD']", nsmgr); 

Vous n'avez pas besoin de spécifier explicitement l'axe descendant ici car il regardera les enfants par défaut, vous pouvez également réduire à:

XmlNode currencyNode = timeNode.SelectSingleNode("ecb:Cube[@currency='USD']", nsmgr); 
+0

Merci. Travaillé parfaitement. Grand pointeur sur l'espace de noms des attributs, je ne le savais pas. –

2

Changer votre XPath à

descendant::ecb:Cube[@currency="USD"] 
+0

hmmm au moment où j'ai ajouté ma réponse réponse similaire a été posté :(. – YoK

Questions connexes