2014-01-05 8 views
1

Учитывая этот XML, как выбрать значение PostBack с помощью запроса xpath?Выберите значение элемента с помощью xpath

<AuthenticateResponse xmlns="http://example.com/authentication/response/1"> 
    <Status>success</Status> 
    <Result>more-info</Result> 
    <StateContext /> 
    <AuthenticationRequirements> 
    <PostBack>/Authentication/ExplicitForms/AuthenticateAttempt</PostBack> 
    <CancelPostBack>/Authentication/ExplicitForms/CancelAuthenticate</CancelPostBack> 
    <CancelButtonText>Cancel</CancelButtonText> 
    </AuthenticationRequirements> 
</AuthenticateResponse> 

Я бы ожидать, что это работает, но он возвращает нуль:

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("AuthenticateResponse", "http://example.com/authentication/response/1"); 
var node = doc.SelectSingleNode("//AuthenticateResponse:AuthenticationRequirements/PostBack", nsmgr); 

ответ

1

Вы должны указать пространство имен для каждого элемента, который вы упоминаете в XPath:

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("ns", "http://example.com/authentication/response/1"); 
var xpath = "/ns:AuthenticateResponse/ns:AuthenticationRequirements/ns:PostBack"; 
var node = doc.SelectSingleNode(xpath, nsmgr); 
+0

Работает как очарование, есть ли ссылка на docs, где это объясняется? – Remko

1

Оно должно быть:

var node = doc.SelectSingleNode("/AuthenticateResponse:AuthenticateResponse/AuthenticateResponse:AuthenticationRequirements/AuthenticateResponse:PostBack", nsmgr); 
+1

Правильно, Сергей Березовский был немного быстрее, поэтому я принял его – Remko

+1

Нет проблем. Его также менее многословный. – Garett

Смежные вопросы