tags:

views:

89

answers:

1

My code doesn't return the node

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

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

I'm pretty sure my XML and Xpath are correct.

My Xpath : /ItemLookupResponse/OperationRequest/RequestId

My XML :

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

The node my XPath returns is always null for some reason. Can someone help?

+8  A: 

Your XPath is almost correct - it just doesn't take into account the default XML namespace on the root node!

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

You need to take that into account and change your code like this:

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

And then your XPath ought to be:

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

Now, your node_.InnerText should definitely not be NULL anymore!

marc_s
Still null :(((
Nick Brooks
oh didn't see the update
Nick Brooks
Awesome! It works! Is it possible to do it without that namespace stuff?
Nick Brooks
@Nick Brooks: no, if there is a XML namespace on the root element, then your XML elements below that are in that namespace, and thus you need to reference them using that namespace. That's the whole point of XML namespace - being able to distinguish XML elements of potential the same name, by putting them into application or vendor-specific namespaces.
marc_s