2010-04-04 14 views
10

Mein Code die Knoten nicht zurückXPath funktioniert nicht wie gewünscht in C#

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

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

Ich bin mir ziemlich sicher, dass meine XML und XPath korrekt ist.

Mein Xpath: /ItemLookupResponse/OperationRequest/RequestId

Meine 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> 

Der Knoten meine XPath kehrt aus irgendeinem Grund immer null. Kann jemand helfen?

Antwort

20

Ihr XPath ist fast korrekt - es berücksichtigt einfach nicht den Standard-XML-Namespace auf dem Wurzelknoten!

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

Sie müssen das berücksichtigen und der Code wie folgt ändern:

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); 

Und dann XPath sollte sein:

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

jetzt Ihre node_.InnerText sollte definitiv nicht sei NULL mehr!

+3

@ Nick Brooks: nein, wenn es ein XML-Namespace auf dem Root-Element, dann Die XML-Elemente darunter befinden sich in diesem Namespace. Daher müssen Sie sie mit diesem Namespace referenzieren. Das ist der springende Punkt im XML-Namespace - XML-Elemente mit dem gleichen Namen unterscheiden zu können, indem sie in anwendungs- oder herstellerspezifische Namespaces eingefügt werden. –

+1

Der Namespace kann so hinzugefügt werden, was etwas besser ist, als den Namespace zu codieren nsmgr.AddNamespace ("x", doc.DocumentElement.NamespaceURI); –

+0

Ähm, können wir es nicht irgendwie einrichten, um entweder (A) automatisch alle 'xmlns' Attribute zu verwenden, oder (B) einfach .NET zu sagen, Namespaces zu ignorieren und das zu finden, was wir buchstäblich in unserer XML-Datei sehen? Wo kommt die Saite '" x "' her? – Qwertie

0

Sorry für die späte Antwort, aber ich hatte ein ähnliches Problem gerade eben.

, wenn Sie wirklich, dass Namespace ignorieren wollen, dann löschen Sie es einfach aus der Zeichenfolge Sie die XmlDocument initialisieren verwenden, um

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; 
Verwandte Themen