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