передача XML-ответа от веб-сервиса soap для сохранения в таблице

#sql #xml #oracle #parsing #plsql

#sql #xml #Oracle #синтаксический анализ #plsql

Вопрос:

Я вызываю службу Soap в plsql и получаю ответ в формате xml. я хочу проанализировать xml и хочу сохранить одно значение в таблице Oracle. Ниже вывод xml :

 <?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <s:Header>
      <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="3c08103b-65da-4f34-95e7-ec2c90ba5b74">00000000-0000-0000-0000-000000000000</ActivityId>
      <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
         <u:Timestamp u:Id="_0">
            <u:Created>2019-04-16T20:21:06.467Z</u:Created>
            <u:Expires>2019-04-16T20:26:06.467Z</u:Expires>
         </u:Timestamp>
      </o:Security>
   </s:Header>
   <s:Body>
      <SaveSalesResponse xmlns="https://unifree.com.tr/services/custom">
         <SaveSalesResult xmlns:a="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:Result>true</a:Result>
            <a:Provision>
               <a:ProvisionNo>245982</a:ProvisionNo>
            </a:Provision>
         </SaveSalesResult>
      </SaveSalesResponse>
   </s:Body>
</s:Envelope>
 

Я хочу сохранить <a:ProvisionNo>245982</a:ProvisionNo> это число в таблице
Пожалуйста, предложите простой способ сохранить значение в таблице

Комментарии:

1. Спасибо Сами. Всегда ли в документе будет только один <a:ProvisionNo> или их будет несколько?

Ответ №1:

Исходя из предпосылки, что приведенный вами пример документа является репрезентативным для используемого макета документа (что существует только один <s:Body> , только с <SaveSalesResponse> одним и т. Д. Для <a:PorivisionNo> каждого документа, EXTRACTVALUE Это все, что должно потребоваться.

Если ваш набор данных включает более сложные структуры, содержащие несколько <a:ProvisionNo> для каждого документа, я бы рекомендовал вместо этого извлекать значения с XMLQUERY помощью / XMLTABLE .

Ниже приведен пример загрузки таблицы с <a:ProvisionNo> помощью via EXTRACTVALUE .

 CREATE TABLE PROVISION_NO(THE_PROVISION_NO INTEGER);

Table created.
 

Затем запустите загрузку:

 INSERT INTO PROVISION_NO(THE_PROVISION_NO)
SELECT EXTRACTVALUE( XMLTYPE('<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Header>
        <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="3c08103b-65da-4f34-95e7-ec2c90ba5b74">00000000-0000-0000-0000-000000000000</ActivityId>
        <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
            <u:Timestamp u:Id="_0">
                <u:Created>2019-04-16T20:21:06.467Z</u:Created>
                <u:Expires>2019-04-16T20:26:06.467Z</u:Expires>
            </u:Timestamp>
        </o:Security>
    </s:Header>
    <s:Body>
        <SaveSalesResponse xmlns="https://unifree.com.tr/services/custom">
            <SaveSalesResult xmlns:a="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Result>true</a:Result>
                <a:Provision>
                    <a:ProvisionNo>245982</a:ProvisionNo>
                </a:Provision>
            </SaveSalesResult>
        </SaveSalesResponse>
    </s:Body>
</s:Envelope>'),
    '/s:Envelope/s:Body/*:SaveSalesResponse/*:SaveSalesResult/a:Provision/a:ProvisionNo',
    'xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://schemas.datacontract.org/2004/07/CustomServiceLibrary.DataContract" ')
FROM DUAL;

1 row created.
 

И результат:

 SELECT THE_PROVISION_NO FROM PROVISION_NO;

   THE_PROVISION_NO
___________________
             245982

1 row selected.