2010-04-04 9 views
10

Mon code ne retourne pas le nœudXPath ne fonctionne pas comme on le souhaite en C#

XmlDocument xml = new XmlDocument(); 
xml.InnerXml = text; 

XmlNode node_ = xml.SelectSingleNode(node); 
return node_.InnerText; // node_ = null ! 

Je suis sûr que mon XML et XPath sont corrects.

Mon Xpath: /ItemLookupResponse/OperationRequest/RequestId

Mon XML:

<?xml version="1.0"?> 
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"> 
    <OperationRequest> 
    <RequestId>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx</RequestId> 
    <!-- the rest of the xml is irrelevant --> 
    </OperationRequest> 
</ItemLookupResponse> 

Le nœud my retourne XPath est toujours nul pour une raison quelconque. Quelqu'un peut-il aider?

Répondre

20

Votre XPath est presque correct - il ne prend tout simplement pas en compte l'espace de noms XML par défaut sur le nœud racine!

<ItemLookupResponse 
    xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"> 
      *** you need to respect this namespace *** 

Vous devez prendre cela en compte et changer votre code comme ceci:

XmlDocument xml = new XmlDocument(); 
xml.InnerXml = text; 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable); 
nsmgr.AddNamespace("x", "http://webservices.amazon.com/AWSECommerceService/2005-10-05"); 

XmlNode node_ = xml.SelectSingleNode(node, nsmgr); 

Et puis votre XPath doit être:

/x:ItemLookupResponse/x:OperationRequest/x:RequestId 

Maintenant, votre node_.InnerText devrait certainement pas être NULL plus!

+3

@ Nick Brooks: non, s'il y a un espace de noms XML sur l'élément racine, votre Les éléments XML ci-dessous qui sont dans cet espace de noms, et donc vous devez les référencer en utilisant cet espace de noms. C'est tout le point de l'espace de noms XML - être capable de distinguer les éléments XML de potentiel du même nom, en les mettant dans des espaces de noms spécifiques aux applications ou aux fournisseurs. –

+1

L'espace de noms peut être ajouté comme ceci, ce qui est un peu mieux que coder en dur l'espace de noms nsmgr.AddNamespace ("x", doc.DocumentElement.NamespaceURI); –

+0

Um, ne pouvons-nous pas le configurer de manière à (A) utiliser automatiquement tous les attributs de 'xmlns', ou (B) juste dire .NET pour ignorer les espaces de noms et correspondre à ce que nous voyons littéralement dans notre fichier XML? Aussi, d'où vient la chaîne '" x "? – Qwertie

0

Désolé pour la réponse tardive mais j'ai eu un problème similaire il y a un instant.

si vous voulez vraiment ignorer cet espace de nom alors juste le supprimer de la chaîne que vous utilisez pour initialiser le XmlDocument

text=text.Replace(
"<ItemLookupResponse xmlns=\"http://webservices.amazon.com/AWSECommerceService/2005-10-05\">", 
"<ItemLookupResponse>"); 

XmlDocument xml = new XmlDocument(); 
xml.InnerXml = text; 

XmlNode node_ = xml.SelectSingleNode(node); 
return node_.InnerText; 
Questions connexes