2016-04-14 15 views
0

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応答を正常に解析する私のクエリの変更を提案できるなら、私は非常に助けていただければ幸いです。

答えて

1

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です。 2番目のxml(cdata)にはデフォルトのnamsespace xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"の宣言も存在します。

2番目の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; 
+0

は完璧に動作します - 2番目のXMLで行方不明タグの謝罪は(それが例に修正されます)。そして、はい、私は作業していた例に似て最初のまわりにタグを追加しましたが、実際のSOAP応答にはデフォルトの名前空間と行セットタグが含まれています。私にこの悩みを癒すお手伝いをありがとう。 –

関連する問題