PLSQL construct XML instances (XML ENCODE)

Benpian instance XML based configuration "PLSQL parses the XML instance 1" type IncreaseCreditAfterRemittance in.

1. The format of the XML data structure as follows:

<ns1:IncreaseCreditAfterRemittance xmlns:ns1="http://tempuri.org/">
 <ns1:parameters>
  <ns1:RemittanceParameterItem>
    <ns1:LeagueCompanyId>2001116</ns1:LeagueCompanyId>
    <ns1:CompanyId>1000</ns1:CompanyId>
    <ns1:RemittanceValue>65000.0</ns1:RemittanceValue>
    <ns1:RemittanceToken>9591503</ns1:RemittanceToken>
    <ns1:RemittanceDateTime>2018-09-26T14:51:22.0Z</ns1:RemittanceDateTime>
    <ns1:Remark>640001391210002018</ns1:Remark>
   </ns1:RemittanceParameterItem>
  </ns1:parameters>
</ns1:IncreaseCreditAfterRemittance>

 

2. Considering the XML configuration used during the program package to the oracle DBMS_XMLDOM DOMDocument special type in the type, which is now encapsulated in a new package definition, is defined as follows XmlResponse:

CREATE OR REPLACE PACKAGE XmlResponse IS response_doc DBMS_XMLDOM.DOMDocument ;
END XmlResponse ;

CREATE OR REPLACE PACKAGE BODY XmlResponse IS END XmlResponse ;

 

3: defining a common package configuration XML program: SoapEncCommon, the particular configuration of the common types of XML tags and the particular method in which the structure of the program package, to facilitate code reuse, easy to maintain. Package procedure is as follows:

CREATE OR REPLACE PACKAGE SoapEncCommon IS
    ------------------------------------
    --author:xy
    --date:20181009
    --description:用于构造XML中具体类型字段
    ------------------------------------
FUNCTION encode_string (p_obj IN VARCHAR2 , p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode ;
FUNCTION encode_int (p_obj IN INTEGER , p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode ;
FUNCTION encode_calendar (p_obj IN TIMESTAMP WITH TIME ZONE, p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode ;
FUNCTION encode_integer (p_obj IN INTEGER , p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode ;
FUNCTION encd_incr_creditafremittance(p_obj IN increasecreditafterremittance ) RETURN DBMS_XMLDOM.DOMDocument;
FUNCTION encode_response(p_obj IN increasecreditafterremittance,p_tag IN VARCHAR2) RETURN DBMS_XMLDOM.DOMNode;
END SoapEncCommon ;




CREATE OR REPLACE PACKAGE BODY SoapEncCommon IS
    ------------------------------------
    --author:xy
    --date:20181009
    --description:用于构造XML中具体类型字段
    ------------------------------------
FUNCTION encode_string (p_obj IN VARCHAR2 , p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode  IS
l_return_node DBMS_XMLDOM.DOMNode ; l_node4 DBMS_XMLDOM.DOMNode ; BEGIN
    l_node4  := DBMS_XMLDOM.makeNode (DBMS_XMLDOM.createElement (XmlResponse.response_doc , p_tag ));
    IF  p_obj  IS NOT NULL THEN
        BEGIN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node4 ,
                                                       DBMS_XMLDOM.
                                                       makeNode (DBMS_XMLDOM.createTextNode (XmlResponse.response_doc , p_obj )));
        END;
    ELSE
        BEGIN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node4 ,
                                                       DBMS_XMLDOM.makeNode (DBMS_XMLDOM.createTextNode (XmlResponse.response_doc , ' ')));
        END;
    END IF;
    RETURN l_node4 ;
END;
FUNCTION encode_int (p_obj IN INTEGER , p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode  IS
BEGIN
    IF  p_obj  IS NOT NULL THEN BEGIN RETURN encode_string (TO_CHAR (p_obj ), p_tag ); END; ELSE
        BEGIN RETURN encode_string (' ', p_tag ); END; END IF;
END;
FUNCTION encode_calendar (p_obj IN TIMESTAMP WITH TIME ZONE, p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode  IS
BEGIN RETURN encode_string (TO_CHAR (p_obj , 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'), p_tag ); END;
FUNCTION encode_integer (p_obj IN INTEGER , p_tag IN VARCHAR2 ) RETURN DBMS_XMLDOM.DOMNode  IS
BEGIN
    IF  p_obj  IS NOT NULL THEN BEGIN RETURN encode_string (TO_CHAR (p_obj ), p_tag ); END; ELSE
        BEGIN RETURN encode_string (' ', p_tag ); END; END IF;
END;


FUNCTION encode_response(p_obj IN increasecreditafterremittance,p_tag IN VARCHAR2) RETURN DBMS_XMLDOM.DOMNode  IS
l_element_1 DBMS_XMLDOM.DOMElement ;
l_return_node DBMS_XMLDOM.DOMNode ;
l_element DBMS_XMLDOM.DOMElement ;
l_node0 DBMS_XMLDOM.DOMNode ;
l_node1 DBMS_XMLDOM.DOMNode ;
l_node2 DBMS_XMLDOM.DOMNode ;
l_node3 DBMS_XMLDOM.DOMNode ;
l_node4 DBMS_XMLDOM.DOMNode ;
BEGIN
    l_element  := DBMS_XMLDOM.createElement (XmlResponse.response_doc , 'ns1:parameters');
    l_node1  := DBMS_XMLDOM.makeNode (l_element );
    
    BEGIN
        l_element_1  := DBMS_XMLDOM.createElement (XmlResponse.response_doc , 'ns1:RemittanceParameterItem');
        l_node2  := DBMS_XMLDOM.makeNode (l_element_1 );
    END;
    
    BEGIN
        IF  p_obj.leaguecompanyid IS NOT NULL THEN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node2, encode_string (p_obj.leaguecompanyid , 'ns1:LeagueCompanyId'));
        END IF;

        IF  p_obj.companyid IS NOT NULL THEN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node2, encode_string (p_obj.companyid , 'ns1:CompanyId'));
        END IF;

        IF  p_obj.remittancevalue IS NOT NULL THEN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node2, encode_string (p_obj.remittancevalue , 'ns1:RemittanceValue'));
        END IF;

        IF  p_obj.remittancetoken IS NOT NULL THEN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node2, encode_string (p_obj.remittancetoken , 'ns1:RemittanceToken'));
        END IF;

        IF  p_obj.remittancedatetime IS NOT NULL THEN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node2, encode_string (p_obj.remittancedatetime , 'ns1:RemittanceDateTime'));
        END IF;

        IF  p_obj.remark IS NOT NULL THEN
            l_return_node  := DBMS_XMLDOM.appendChild (l_node2, encode_string (p_obj.remark , 'ns1:Remark'));
        END IF;
    END;

    BEGIN
        l_return_node  := DBMS_XMLDOM.appendChild (l_node1 , l_node2);
    END;
    
    BEGIN
        l_element  := DBMS_XMLDOM.createElement (XmlResponse.response_doc , p_tag );
        l_node0  := DBMS_XMLDOM.makeNode (l_element );
        l_return_node  := DBMS_XMLDOM.appendChild (l_node0, l_node1 );
    END;

    RETURN l_node0 ;
END;

FUNCTION encd_incr_creditafremittance(p_obj IN increasecreditafterremittance ) RETURN DBMS_XMLDOM.DOMDocument  IS
l_response_node DBMS_XMLDOM.DOMNode ; l_element DBMS_XMLDOM.DOMElement ; l_node DBMS_XMLDOM.DOMNode ; l_fcall_tmp DBMS_XMLDOM.DOMNode ;
BEGIN
    XmlResponse.response_doc  := DBMS_XMLDOM.newDOMDocument ();
    l_response_node  := encode_response(p_obj , 'ns1:IncreaseCreditAfterRemittance');
    l_element  := DBMS_XMLDOM.makeElement (l_response_node );
    l_node  := DBMS_XMLDOM.makeNode (XmlResponse.response_doc );
    l_fcall_tmp  := DBMS_XMLDOM.appendChild (l_node , l_response_node );
    DBMS_XMLDOM.setAttribute (l_element , 'xmlns:ns1',
                              'http://tempuri.org/');
    RETURN XmlResponse.response_doc ;
END;
END SoapEncCommon ;

 

4. Write test cases to validate the XML structure of the program functions correctly, the test case as follows:

DECLARE 

   l_request    increasecreditafterremittance;
   responseDoc DBMS_XMLDOM.DOMDOCUMENT;
   l_xmltype XMLTYPE;
   response_clob clob;
   
begin
   l_request := increasecreditafterremittance();
   
   l_request.leaguecompanyid := '2001116';
   l_request.companyid := '1000';
   l_request.remittancevalue := '6500.0';
   l_request.remittancetoken := '9591503';
   l_request.remittancedatetime := '2018-09-26T14:51:22.0Z';
   l_request.remark := '640001391210002018';

   responseDoc := SoapEncCommon.encd_incr_creditafremittance(l_request);
   l_xmltype := dbms_xmldom.getXmlType(responseDoc);
   dbms_xmldom.freeDocument(responseDoc);
   response_clob := l_xmltype.getClobVal;
   raise_application_error(-20201,'response xml:'||response_clob);
end;

Test run results are as follows:

 (Note: The value of each source label use has become a resulting construct XML data in tag value are the same)

 

5. These are just doing a simple display for simple XML structure, an XML format to complex data structure, such as: data format with nested loops, it is not difficult in fact, only the feature tag corresponding to the cycle of the type for the new variable (members) cycle stored value tag and the loop through this particular variable configuration program, the loop data in XML format added sequentially different values ​​of the same label.

 

Guess you like

Origin www.cnblogs.com/Jeffrey-xu/p/12044001.html