Разбор ответа SOAP в PLSQL

Я пытаюсь разобрать webservice SOAP-ответ, возвращаемый JAVA webservice в plsql. Я не сталкиваюсь с ошибкой, но я ничего не получаю. Ниже приведен код

WITH t as (select XMLTYPE('<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:helloResponse xmlns:ns2="http://example.com/">
         <ns2:return>Hello World</ns2:return>
      </ns2:helloResponse>
   </S:Body>
</S:Envelope>') as xml from dual)
  select * 
  from t,
        xmltable(XMLNAMESPACES('http://example.com/' as "ns2"),
                '/Envelope/Body'
                passing t.xml
                columns myret varchar2(50) path '/ns2:helloResponse/ns2:return'
        ) x

Что я здесь делаю неправильно?


person Usman Riaz    schedule 17.11.2018    source источник


Ответы (1)


Я вижу здесь пару проблем....

1) У вас есть два пространства имен (одно для оболочки и тела, а другое для узлов), вам нужно учитывать оба из них в вашем выборе

2) в вашем пути для MyRet контекст из конверта, поэтому вам нужно либо указать полный путь, либо использовать // в начале.

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

 WITH t as (select XMLTYPE('<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:helloResponse xmlns:ns2="http://example.com/">
         <ns2:return>Hello World</ns2:return>
      </ns2:helloResponse>
   </S:Body>
</S:Envelope>') as xml from dual)
  select * 
  from t,
        xmltable(XMLNAMESPACES('http://example.com/' as "ns2", 'http://schemas.xmlsoap.org/soap/envelope/' as "S"),
                '/S:Envelope/S:Body'
                passing t.xml
                columns myret varchar2(50) path '//ns2:helloResponse/ns2:return'
        ) x
person Shaun Peterson    schedule 19.11.2018