XPath не работает должным образом в C # - PullRequest
10 голосов
/ 05 апреля 2010

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

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>

Узел, который возвращает мой XPath, по какой-то причине всегда равен нулю.Может кто-нибудь помочь?

Ответы [ 2 ]

20 голосов
/ 05 апреля 2010

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

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

0 голосов
/ 31 марта 2017

Извините за поздний ответ, но у меня была похожая проблема только минуту назад.

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