XMLTABLE을 사용하여 SOAP 응답의 CDATA 섹션을 구문 분석하는 방법을 알아보기 위해이 스레드 의 예제를 따르고 있습니다. 데이터베이스는 Oracle Database 11g Enterprise Edition 11.2.0.4.0입니다.
내가 살펴본 예제와 유사하게 작동하는 쿼리를 가질 수 있도록 구문 분석해야하는 SOAP 응답을 수정했습니다.
따라서 이것은 약간 단순화 된 응답 봉투이지만 정상적으로 작동하는 것입니다.
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 응답은 다음과 같습니다.
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;
이 비트로 인해 행 집합 xmlns = "urn : schemas-microsoft-com : xml-analysis : rowset", 내 코드가 더 이상 작동하지 않으며이 문제를 극복하는 방법을 모릅니다. 이 SOAP 응답을 성공적으로 구문 분석 할 수있는 내 쿼리 수정을 제안 할 수 있다면 도움을 주시면 감사하겠습니다.
1) secound sopa 요청에 cdata에 잘못된 xml이 있습니다.
SELECT A1.Row1
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
보고
<rowset xmlns="urn:schemas-microsoft-com:xml-analysis:rowset" >
<Row>
<Column0>01200/Column0> --<-- invalid tag column0 isn't closed
<Column1>East Region</Column1>
</Row>
<Row>
<Column0>3000</Column0>
<Column1>West Region</Column1>
</Row>
</rowset>
첫 번째 xml (cdata) row
요소의 경로 는 /Data/row
두 번째입니다 /rowset/row
. 두 번째 xml (cdata)에는 기본 namsespace 선언도 있습니다 xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"
.
두 번째 xmltable에서 경로를 변경 '*/Row'
하고 xml 네임 스페이스를 제거 할 수 있습니다 .passing xmlparse(document regexp_replace(A1.Row1,'xmlns=".*"', ''))
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(
'/*/Row'
passing xmlparse(document regexp_replace(A1.Row1,'xmlns=".*"', ''))
columns
Amount number PATH 'Column0',
Region varchar2(60) PATH 'Column1'
) B2;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다