开发者

XPath doesn't work as desired in C#

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"?>
&l开发者_StackOverflow中文版t;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>

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


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">
             *** 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!


Sorry for the late reply but I had a similar problem just a moment ago.

if you REALLY want to ignore that namespace then just delete it from the string you use to initialise the 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;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜