XPath не работает по желанию в С#

Мой код не возвращает node

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

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

Я уверен, что мои XML и Xpath верны.

Мой Xpath: /ItemLookupResponse/OperationRequest/RequestId

Мой 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>

Возврат node my XPath всегда по умолчанию является нулевым. Может кто-нибудь помочь?

Ответ 1

Ваш XPath почти прав - он просто не учитывает пространство имен XML по умолчанию в корневом каталоге node!

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

Вам нужно принять это во внимание и изменить свой код следующим образом:

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

И тогда ваш XPath должен быть:

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

Теперь ваш node_.InnerText больше не должен быть NULL!

Ответ 2

Извините за поздний ответ, но у меня была аналогичная проблема всего лишь минуту назад.

если вы ДЕЙСТВИТЕЛЬНО хотите игнорировать это пространство имен, просто удалите его из строки, используемой для инициализации 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;