XPath не работает так, как хотелось бы в C#



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



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, по какой-то причине всегда равен нулю. Может кто-нибудь помочь?

525   2  

2 ответов:

Ваш 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 определенно должен больше не быть нулевым!

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

Если вы действительно хотите игнорировать это пространство имен, то просто удалите его из строки, которую вы используете для инициализации 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;

Comments

    Ничего не найдено.