Разбор SOAP XML в Oracle - PullRequest
       31

Разбор SOAP XML в Oracle

2 голосов
/ 05 марта 2010

Я новичок в Oracle, и я работаю над тем, что должно проанализировать SOAP-запрос и сохранить адрес в таблицах БД. Я использую синтаксический анализатор XML в Oracle (XMLType) с XPath, но изо всех сил, так как я не могу понять, как проанализировать запрос SOAP, поскольку он имеет несколько пространств имен.

Может ли кто-нибудь дать мне пример?

Заранее спасибо !!!

редактировать

Это будет типичный запрос SOAP, аналогичный приведенному ниже.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"        
                  xmlns:soap="http://soap.service.****.com"> 
  <soapenv:Header /> 
  <soapenv:Body> 
    <soap:UpdateElem> 
      <soap:request> 
        <soap:att1>123456789</soap:att1> 
        <soap:att2 xsi:nil="true" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />                       
        <soap:att3>L</soap:att3> 
        ..... 
      </soap:request> 
    </soap:UpdateElem>
  </soapenv:Body> 
</soapenv:Envelope>

Мне нужно получить параметры att1, att2 ... и сохранить их в таблице БД.

1 Ответ

1 голос
/ 03 мая 2010

При реализации Oracle в XML возможно несколько способов измельчения определенной капусты. Вот решение, которое использует XMLTable() для изоляции атрибутов.

Я поместил ваше сообщение SOAP в таблицу со столбцом XMLType:

SQL> set long 5000
SQL> select xt.xmlmsg
  2  from xt
  3  where id = 1
  4  /

XMLMSG
--------------------------------------------------------------------------------
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                  xmlns:soap="http://soap.service.****.com">
  <soapenv:Header />
  <soapenv:Body>
    <soap:UpdateElem>
      <soap:request>
        <soap:att1>123456789</soap:att1>
        <soap:att2 xsi:nil="true"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
        <soap:att3>L</soap:att3>
        .....
      </soap:request>
    </soap:UpdateElem>
  </soapenv:Body>
</soapenv:Envelope>
SQL>

Этот SELECT использует XPath для извлечения атрибутов в виде столбцов. Обратите внимание на использование предложения XMLTable() XMLNAMESPACES для определения пространств имен.

SQL> select
  2      atts.att1
  3      , atts.att2
  4      , atts.att3
  5  from xt
  6       , xmltable(
  7              xmlnamespaces(
  8                  'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv"
  9                     , 'http://soap.service.****.com' as "soap"
 10                     , 'http://www.w3.org/2001/XMLSchema-instance' as "xsi"
 11                          )
 12               , '/soapenv:Envelope/soapenv:Body/soap:UpdateElem/soap:request'
 13               passing xt.xmlmsg
 14               columns
 15                   att1 number path 'soap:att1'
 16                   , att2 varchar2(10) path 'soap:att2/@xsi:nil'
 17                   , att3 char(1) path 'soap:att3'
 18                   ) atts
 19  where xt.id = 1
 20  /

      ATT1 ATT2       A
---------- ---------- -
 123456789 true       L

SQL>
...