Tuesday, November 19, 2019

How to Parse XML using DOM Parser in Oracle

SET DEFINE OFF;
SET SERVEROUTPUT ON;

DECLARE
   v_mds_xml_parser           DBMS_XMLPARSER.parser;
   v_mds_xml_doc              DBMS_XMLDOM.domdocument;
   v_Release_node             xmldom.domnode;
   node_not_exists            EXCEPTION;
   v_ShipToLocationRef_list   xmldom.domnodelist;
   v_ShipToLocationRef_node   xmldom.domnode;
   v_LocationRef_list         xmldom.domnodelist;
   v_LocationRef_node         xmldom.domnode;
   v_Location_list            xmldom.domnodelist;
   v_Location_node            xmldom.domnode;
   v_TransactionCode          VARCHAR2 (1000) := NULL;
   v_LocationGid_list         xmldom.domnodelist;
   v_LocationGid_node         xmldom.domnode;
   v_Gid_list                 xmldom.domnodelist;
   v_Gid_node                 xmldom.domnode;
   v_DomainName               VARCHAR2 (1000) := NULL;
   v_Xid                      VARCHAR2 (1000) := NULL;
   v_LocationName             VARCHAR2 (1000) := NULL;
   v_Address_list             xmldom.domnodelist;
   v_Address_node             xmldom.domnode;
   v_AddressLine1             VARCHAR2 (100) := NULL;
   v_AddressLine2             VARCHAR2 (100) := NULL;
   v_City                     VARCHAR2 (100) := NULL;
   v_Province                 VARCHAR2 (100) := NULL;
   v_PostalCode               VARCHAR2 (100) := NULL;
   v_CountryCode_list         xmldom.domnodelist;
   v_CountryCode_node         xmldom.domnode;
   v_CountryCode              VARCHAR2 (100) := NULL;

   reqxml                     CLOB
      := '<sample:Release xmlns:sample="http://xmlns.oracle.com/apps/sample/transmission/v6.4" xmlns:gtm="http://xmlns.oracle.com/apps/gtm/transmission/v6.4">
    <sample:ReleaseGid>
        <sample:Gid>
            <sample:DomainName>ABC</sample:DomainName>
            <sample:Xid>1234</sample:Xid>
        </sample:Gid>
    </sample:ReleaseGid>
    <sample:TransactionCode>CR</sample:TransactionCode>
    <sample:ShipToLocationRef>
        <sample:LocationRef>
            <sample:Location>
                <sample:TransactionCode>KK</sample:TransactionCode>
                <sample:LocationGid>
                    <sample:Gid>
                        <sample:DomainName>ABC</sample:DomainName>
                        <sample:Xid>87901111</sample:Xid>
                    </sample:Gid>
                </sample:LocationGid>
                <sample:LocationName>MADIWALA</sample:LocationName>
                <sample:Address>
                    <sample:AddressLine1>41, BTM LAYOUT</sample:AddressLine1>
                    <sample:AddressLine2/>
                    <sample:City>BANGALORE</sample:City>
                    <sample:Province/>
                    <sample:PostalCode>560076</sample:PostalCode>
                    <sample:CountryCode>
                        <sample:CountryCode2>KR</sample:CountryCode2>
                    </sample:CountryCode>
                </sample:Address>
                <sample:Contact>
                    <sample:ContactGid>
                        <sample:Gid>
                            <sample:DomainName>ABC</sample:DomainName>
                            <sample:Xid>87901111</sample:Xid>
                        </sample:Gid>
                    </sample:ContactGid>
                    <sample:IsPrimaryContact>Y</sample:IsPrimaryContact>
                </sample:Contact>
                <sample:LocationRole>
                    <sample:LocationRoleGid>
                        <sample:Gid>
                            <sample:DomainName>PUBLIC</sample:DomainName>
                            <sample:Xid>SHIPFROM/SHIPTO</sample:Xid>
                        </sample:Gid>
                    </sample:LocationRoleGid>
                </sample:LocationRole>
            </sample:Location>
        </sample:LocationRef>
    </sample:ShipToLocationRef>
</sample:Release>';

   FUNCTION f_verify_and_gettag_value (i_elem       xmldom.domelement,
                                       i_tagname    VARCHAR2)
      RETURN VARCHAR2
   IS
      pnodelist            xmldom.domnodelist;
      pnode                xmldom.domnode;
      pelement             xmldom.domelement;
      e_xmltag_notexists   EXCEPTION;
   BEGIN
      pnodelist := xmldom.getchildrenbytagname (i_elem, i_tagname);
      pnode := xmldom.item (pnodelist, 0);

      IF (xmldom.isnull (pnode))
      THEN
         RAISE e_xmltag_notexists;
      END IF;

      IF xmldom.haschildnodes (pnode)
      THEN
         IF (xmldom.getnodetype (pnode) = xmldom.element_node)
         THEN
            pnode := xmldom.getfirstchild (pnode);
            RETURN (xmldom.getnodevalue (pnode));
         END IF;
      END IF;

      RETURN NULL;
   EXCEPTION
      WHEN e_xmltag_notexists
      THEN
         RETURN NULL;
   END f_verify_and_gettag_value;

   PROCEDURE p_get_node_value (io_outval   IN OUT VARCHAR2,
                               i_tagnode          xmldom.domnode,
                               i_tagname          VARCHAR2)
   IS
      tagval               VARCHAR2 (30000);
      e_xmltag_notexists   EXCEPTION;
   BEGIN
      BEGIN
         tagval :=
            f_verify_and_gettag_value (xmldom.makeelement (i_tagnode),
                                       i_tagname);
         io_outval := tagval;
      EXCEPTION
         WHEN e_xmltag_notexists
         THEN
            io_outval := NULL;
            -- mr8328 on 12/01/2016
            -- do not set out val if already exists as tag itself not there
            NULL;
      END;
   END p_get_node_value;
BEGIN
   reqxml := REPLACE (reqxml, '&', CHR (ASCII ('&')) || 'amp;'); -- To handle &

   v_mds_xml_parser := DBMS_XMLPARSER.newparser;
   xmlparser.parseclob (v_mds_xml_parser, reqxml);
   v_mds_xml_doc := DBMS_XMLPARSER.getdocument (v_mds_xml_parser);


   /* Checking Parent Node is exists or Not and Raising Exception if not present*/
   v_Release_node :=
      xmldom.item (xmldom.getelementsbytagname (v_mds_xml_doc, 'Release'), 0);

   IF (xmldom.isnull (v_Release_node))
   THEN
      RAISE node_not_exists;
   END IF;

   /*ShipToLocationRef */
   v_ShipToLocationRef_list :=
      xmldom.getchildrenbytagname (xmldom.makeelement (v_Release_node),
                                   'ShipToLocationRef');
   v_ShipToLocationRef_node := xmldom.item (v_ShipToLocationRef_list, 0);

   /*LocationRef */
   v_LocationRef_list :=
      xmldom.getchildrenbytagname (
         xmldom.makeelement (v_ShipToLocationRef_node),
         'LocationRef');
   v_LocationRef_node := xmldom.item (v_LocationRef_list, 0);

   /*Location */
   v_Location_list :=
      xmldom.getchildrenbytagname (xmldom.makeelement (v_LocationRef_node),
                                   'Location');
   v_Location_node := xmldom.item (v_Location_list, 0);


   p_get_node_value (v_TransactionCode, v_Location_node, 'TransactionCode');
   DBMS_OUTPUT.PUT_LINE ('v_TransactionCode=' || v_TransactionCode);

   /*LocationGid */
   v_LocationGid_list :=
      xmldom.getchildrenbytagname (xmldom.makeelement (v_LocationRef_node),
                                   'LocationGid');
   v_LocationGid_node := xmldom.item (v_LocationGid_list, 0);

   /*Gid */
   v_Gid_list :=
      xmldom.getchildrenbytagname (xmldom.makeelement (v_LocationGid_node),
                                   'Gid');
   v_Gid_node := xmldom.item (v_Gid_list, 0);

   p_get_node_value (v_DomainName, v_Gid_node, 'DomainName');
   p_get_node_value (v_Xid, v_Gid_node, 'Xid');
   DBMS_OUTPUT.PUT_LINE ('v_DomainName=' || v_DomainName);
   DBMS_OUTPUT.PUT_LINE ('v_Xid=' || v_Xid);

   p_get_node_value (v_LocationName, v_Location_node, 'TransactionCode');
   DBMS_OUTPUT.PUT_LINE ('v_LocationName=' || v_LocationName);

   /*Address*/
   v_Address_list :=
      xmldom.getchildrenbytagname (xmldom.makeelement (v_Location_node),
                                   'Address');
   v_Address_node := xmldom.item (v_Address_list, 0);
   p_get_node_value (v_AddressLine1, v_Address_node, 'AddressLine1');
   p_get_node_value (v_AddressLine2, v_Address_node, 'AddressLine2');
   p_get_node_value (v_city, v_Address_node, 'City');
   p_get_node_value (v_Province, v_Address_node, 'Province');
   p_get_node_value (v_PostalCode, v_Address_node, 'PostalCode');

   DBMS_OUTPUT.PUT_LINE ('v_AddressLine1=' || v_AddressLine1);
   DBMS_OUTPUT.PUT_LINE ('v_AddressLine2=' || v_AddressLine2);
   DBMS_OUTPUT.PUT_LINE ('v_city=' || v_city);
   DBMS_OUTPUT.PUT_LINE ('v_Province=' || v_Province);
   DBMS_OUTPUT.PUT_LINE ('v_PostalCode=' || v_PostalCode);

   /*CountryCode*/
   v_CountryCode_list :=
      xmldom.getchildrenbytagname (xmldom.makeelement (v_Address_node),
                                   'Address');
   v_CountryCode_node := xmldom.item (v_Address_list, 0);

   p_get_node_value (v_CountryCode, v_CountryCode_node, 'CountryCode');
   DBMS_OUTPUT.PUT_LINE ('v_CountryCode=' || v_CountryCode);
EXCEPTION
   WHEN node_not_exists
   THEN
      DBMS_OUTPUT.put_line ('No node exists with the request XML');
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (
            'Oracle Error Number:'
         || SQLCODE
         || 'Oracle Error Message:'
         || SQLERRM);
END;
/


v_TransactionCode=NP
v_DomainName=
v_Xid=
v_LocationName=NP
v_AddressLine1=189, GASAN DIGITAL 1-RO
v_AddressLine2=
v_city=GEUMCHEON-GU
v_Province=
v_PostalCode=08503
v_CountryCode=

PL/SQL procedure successfully completed.

SQL>

No comments:

Post a Comment

Delete Row Button to all records of Interactive Report in Oracle Apex

 1. add 'Delete' Del column to Report Query 2. Set the Following Properties for the DEL Column Type: Link Heading: Delete Targ...