XML応答を使用してSOAP応答のCDATAセクションを解析する方法については、このthreadの例に従っています。データベースはOracle Database 11g Enterprise Edition 11.2.0.4.0です。XMLTABLEを使用してSOAPのCDATAセクションを解析する
私が調べていたSOAP応答を修正して、私が見ていた例に似た、動作するクエリを持つことができました。
だから、これは少し簡略化され、応答エンベロープとはいえ、[OK]を働いているものです。
CREATE TABLE xml_tab (xml_data xmltype);
DECLARE l
l_xmltype xmltype;
BEGIN
SELECT xmltype('<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" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:sawsoap="urn://oracle.bi.webservices/v6">
<soap:Body>
<sawsoap:executeSQLQueryResult>
<sawsoap:return xsi:type="sawsoap:QueryResults">
<sawsoap:rowset><![CDATA[<Data><Row><Column0>1200</Column0><Column1>East Region</Column1></Row><Row><Column0>3000</Column0><Column1>West Region</Column1></Row></Data>]]></sawsoap:rowset>
<sawsoap:queryID/>
<sawsoap:finished>true</sawsoap:finished>
</sawsoap:return>
</sawsoap:executeSQLQueryResult>
</soap:Body>
</soap:Envelope>') INTO l_xmltype FROM dual ;
INSERT INTO xml_tab VALUES(l_xmltype);
END;
そして、このクエリは、私が望む結果を返します。
SELECT B2.*
FROM
xml_tab x,
XMLTable(
XMLNamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP-ENV"
,'urn://oracle.bi.webservices/v6' AS "sawsoap"
)
, 'SOAP-ENV:Envelope/SOAP-ENV:Body/sawsoap:executeSQLQueryResult/sawsoap:return/sawsoap:rowset'
passing x.XML_DATA
columns Row1 clob path '.'
) A1,
XMLTable(
'/Data/Row'
passing xmlparse(document A1.Row1)
columns
Amount number PATH 'Column0',
Region varchar2(60) PATH 'Column1'
) B2;
AMOUNT REGION
---------- ------------------------------------------------------------
1200 East Region
3000 West Region
は、残念ながら実際のSOAP応答をそのI解析する必要があります:
truncate table xml_tab;
DECLARE
l_xmltype xmltype;
BEGIN
SELECT xmltype('<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" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:sawsoap="urn://oracle.bi.webservices/v6">
<soap:Body>
<sawsoap:executeSQLQueryResult>
<sawsoap:return xsi:type="sawsoap:QueryResults">
<sawsoap:rowset><![CDATA[<rowset xmlns="urn:schemas-microsoft-com:xml-analysis:rowset" ><Row><Column0>01200</Column0><Column1>East Region</Column1></Row><Row><Column0>3000</Column0><Column1>West Region</Column1></Row></rowset>]]></sawsoap:rowset>
<sawsoap:queryID/>
<sawsoap:finished>true</sawsoap:finished>
</sawsoap:return>
</sawsoap:executeSQLQueryResult>
</soap:Body>
</soap:Envelope>')
INTO l_xmltype
FROM dual ;
INSERT INTO xml_tab VALUES
(l_xmltype
);
END;
このビットのため、行set xmlns = "urn:schemas-microsoft-com:xml-analysis:rowset"、私のコードはもう機能しません。誰かがこのSOAP応答を正常に解析する私のクエリの変更を提案できるなら、私は非常に助けていただければ幸いです。
は完璧に動作します - 2番目のXMLで行方不明タグの謝罪は(それが例に修正されます)。そして、はい、私は作業していた例に似て最初のまわりにタグを追加しましたが、実際のSOAP応答にはデフォルトの名前空間と行セットタグが含まれています。私にこの悩みを癒すお手伝いをありがとう。 –