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;