Что не так с запросом XPath в ответе SOAP - PullRequest
7 голосов
/ 17 октября 2011

Мне нужно создать запрос xpath, который будет возвращать все, что перечислено в элементе availablebilty.

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

Ответы [ 4 ]

17 голосов
/ 17 октября 2011

Вам необходимо определить префикс для http://schemas.livebookings.net/Ingrid/version2/2007/06/ пространства имен в вашем движке XPath, например префикс a, затем:

//a:Availability

Он выберет a:Availability элемент.

Или вы можете использовать этот XPath:

//*[local-name() = 'Availability']
1 голос
/ 17 октября 2011

Мне нужно создать запрос xpath, который будет возвращать все перечисленное при наличии элемента

Используйте

/*/Soap:Body/x:GetAvailableTimesResult/x:Availability/node()

Где в вашей программе вы связали (зарегистрирован) префикс "x" с пространством имен "http://schemas.livebookings.net/Ingrid/version2/2007/06/".

Это наиболее часто задаваемые вопросы в XPath.

Выполните поиск «пространства имен XPath по умолчанию», чтобы получить более подробное объяснение.

0 голосов
/ 15 июня 2016

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

0 голосов
/ 13 декабря 2014

Благодаря @Kirill Polishchuk

Однако, если вы хотите извлечь только одно значение из списка, вы можете сделать:

//*[local-name() = 'Availability'][position()=1]

или для последнего:

//*[local-name() = 'Availability'][last()]
...