#xml #xslt #xpath #soap #soapui
#xml — файл #в XSLT #xpath #soap #soapui #xml #xslt
Вопрос:
Мне нужно создать запрос xpath, который вернет все, что указано в элементе доступности.
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetAvailableTimesResult xmlns="http://schemas.test.net/x/version2/2007/06/" resultcode="SearchOk">
<Availability>
<Result available="true" time="2011-10-17T17:00:00"/>
<Result available="true" time="2011-10-17T17:15:00"/>
<Result available="true" time="2011-10-17T17:30:00"/>
<Result available="true" time="2011-10-17T17:45:00"/>
<Result available="true" time="2011-10-17T18:00:00"/>
<Result available="true" time="2011-10-17T18:15:00"/>
<Result available="true" time="2011-10-17T18:30:00"/>
<Result available="true" time="2011-10-17T18:45:00"/>
<Result available="true" time="2011-10-17T19:00:00"/>
<Result available="true" time="2011-10-17T19:15:00"/>
<Result available="true" time="2011-10-17T19:30:00"/>
<Result available="true" time="2011-10-17T19:45:00"/>
<Result available="true" time="2011-10-17T20:00:00"/>
<Result available="true" time="2011-10-17T20:15:00"/>
<Result available="true" time="2011-10-17T20:30:00"/>
<Result available="true" time="2011-10-17T20:45:00"/>
<Result available="true" time="2011-10-17T21:00:00"/>
<Result available="true" time="2011-10-17T21:15:00"/>
<Result available="true" time="2011-10-17T21:30:00"/>
<Result available="true" time="2011-10-17T21:45:00"/>
<Result available="true" time="2011-10-17T22:00:00"/>
<Result available="true" time="2011-10-17T22:15:00"/>
<Result available="true" time="2011-10-17T22:30:00"/>
</Availability>
</GetAvailableTimesResult>
</soap:Body>
</soap:Envelope>
Мой запрос xpath возвращает сообщение об ошибке с искаженным выражением xpath, запрос выглядит следующим образом:
//xsi:[soap:body]//Availability
Ответ №1:
Вам нужно определить префикс для http://schemas.livebookings.net/x/version2/2007/06/
пространства имен в вашем движке XPath, например, префикс a
, затем:
//a:Availability
Он выберет a:Availability
элемент.
Или вы можете использовать этот XPath:
//*[local-name() = 'Availability']
Ответ №2:
Мне нужно создать запрос xpath, который вернет все, что указано в элементе доступности
Использовать:
/*/Soap:Body/x:GetAvailableTimesResult/x:Availability/node()
Где в вашей программе вы связали (зарегистрировали) "x"
префикс с "http://schemas.livebookings.net/Ingrid/version2/2007/06/"
пространством имен.
Это самый часто задаваемый вопрос в XPath.
Найдите «пространство имен XPath по умолчанию», чтобы получить более подробное объяснение.
Ответ №3:
Благодаря @Kirill Polishchuk
Однако, если вы хотите извлечь только одно значение из списка, вы можете сделать:
//*[local-name() = 'Availability'][position()=1]
или для последнего:
//*[local-name() = 'Availability'][last()]
Ответ №4:
Вам необходимо указать правильное пространство имен в вашем XPath. Надеюсь, следующий блок кода поможет вам.
v_Value := DBMS_XMLDOM.GetNodeValue(XslProcessor.SelectSingleNode(v_RootNode, '/soap:Envelope/soap:Body/GetLiveAnalysisIDSResponse[1]/AnalysisIDs[1]/guid[1]/text()'
,'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="https://www.dummynet.net/"'));
Этот код работал у меня при извлечении значения узла из XML-ответа SOAP.