Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle 12c PLSQL SOAP EXTRACTVALUE dalla risposta dell'array

Il tuo XML è incompleto; supponendo che tu abbia ancora la busta e il corpo SOAP attorno a quello, puoi usare XMLTable con XMLNamespaces, come mostrato prima (e extractvalue è ancora obsoleto ):

select item
from XMLTable(
  XMLNamespaces (
    default 'urn:DHCPProv',
    'http://schemas.xmlsoap.org/soap/envelope/' as "soap",
    'http://schemas.xmlsoap.org/soap/encoding/' as "soapenc"
  ),
  '/soap:Envelope/soap:Body/getDhcpForPortResponse/soapenc:Array/item/item'
  passing XMLType(xml_string)
  columns item varchar2(4000) path '.'
)

Quindi, con i tuoi dati e i bit SOAP aggiunti:

select item
from XMLTable(
  XMLNamespaces (
    default 'urn:DHCPProv',
    'http://schemas.xmlsoap.org/soap/envelope/' as "soap",
    'http://schemas.xmlsoap.org/soap/encoding/' as "soapenc"
  ),
  '/soap:Envelope/soap:Body/getDhcpForPortResponse/soapenc:Array/item/item'
  passing XMLType('<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
            <getDhcpForPortResponse
                xmlns="urn:DHCPProv">
                <soapenc:Array
                    soapenc:arrayType="soapenc:Array[2]"
                    xsi:type="soapenc:Array">
                    <item
                        soapenc:arrayType="xsd:string[5]"
                        xsi:type="soapenc:Array">
                        <item
                            xsi:type="xsd:string">
                            qbtp8482tv
                            </item>
                        <item
                            xsi:type="xsd:string">
                            111.11.111.111
                            </item>
                        <item
                            xsi:type="xsd:string">
                            bc644ba2501c
                            </item>
                        <item
                            xsi:type="xsd:string">
                            MF5601T_AMD-NDF
                            </item>
                        <item
                            xsi:type="xsd:string"/>
                        </item>
                    <item
                        soapenc:arrayType="xsd:string[5]"
                        xsi:type="soapenc:Array">
                        <item
                            xsi:type="xsd:string">
                            qbtp8482tv
                            </item>
                        <item
                            xsi:type="xsd:string">
                            222.22.222.222
                            </item>
                        <item
                            xsi:type="xsd:string">
                            704fb8f3e4e1
                            </item>
                        <item
                            xsi:type="xsd:string">
                            MF5601T_AMD-NDF
                            </item>
                        <item
                            xsi:type="xsd:string"/>
                        </item>
                    </soapenc:Array>
                </getDhcpForPortResponse>
 </soap:Body>
 </soap:Envelope>')
  columns item varchar2(4000) path '.'
)

che ottiene:

ITEM
--------------------------------------------------

                            qbtp8482tv
                            

                            111.11.111.111
                            

                            bc644ba2501c
                            

                            MF5601T_AMD-NDF
                            
(null)

                            qbtp8482tv
                            

                            222.22.222.222
                            

                            704fb8f3e4e1
                            

                            MF5601T_AMD-NDF
                            
(null)

db<>violino

che è un po' disordinato a causa delle nuove righe e degli spazi iniziali nel tuo esempio. Se esistono davvero, puoi tagliarli:

select rtrim(ltrim(item, chr(32)||chr(10)), chr(10)||chr(32)) as item
from XMLTable...

che dà:

ITEM
--------------------
qbtp8482tv
111.11.111.111
bc644ba2501c
MF5601T_AMD-NDF
(null)
qbtp8482tv
222.22.222.222
704fb8f3e4e1
MF5601T_AMD-NDF
(null)

E puoi escludere i valori null se non li vuoi.

Se non hai il wrapper SOAP, allora è più complicato; puoi usare i caratteri jolly in XPath ma l'XML non sarà valido e non verrà analizzato correttamente, quindi dovresti rimuovere i prefissi dello spazio dei nomi o aggiungere nuovamente il wrapper. Sulla base della tua domanda precedente, non penso che sia il caso però.