1:PLSQL解析有嵌套的复杂XML数据,xml数据格式如下:
<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:test>
<ns1:Remark1>123</ns1:Remark1>
<ns1:Remark1>456</ns1:Remark1>
</ns1:test>
<orderLines>
<orderLine>
<orderLineNo></orderLineNo>
<ownerCode>QBXA019</ownerCode>
<itemCode>27313011617033329</itemCode>
<planQty>0</planQty>
<actualQty>1</actualQty>
</orderLine>
<orderLine>
<orderLineNo></orderLineNo>
<ownerCode>QBXA019</ownerCode>
<itemCode>27313011617033339</itemCode>
<planQty>0</planQty>
<actualQty>1</actualQty>
</orderLine>
</orderLines>
</ns1:RemittanceParameterItem>
</ns1:parameters>
</ns1:IncreaseCreditAfterRemittance>
2:编写解析程序,increasecreditafterremittance为自定义type:
CREATE OR REPLACE FUNCTION decd_incr_creditafremittance1(p_node IN dbms_xmldom.domnode)
RETURN increasecreditafterremittance IS
l_obj increasecreditafterremittance;
l_children dbms_xmldom.domnodelist;
l_length INTEGER;
l_i INTEGER;
l_child dbms_xmldom.domnode;
l_name VARCHAR2(32767);
l_decode_result VARCHAR2(32767);
l_children1 dbms_xmldom.domnodelist;
l_length1 INTEGER;
l_child1 dbms_xmldom.domnode;
idx INTEGER;
l_children2 dbms_xmldom.domnodelist;
l_length2 INTEGER;
l_child2 dbms_xmldom.domnode;
/* l_children3 dbms_xmldom.domnodelist;
l_length3 INTEGER;
l_child3 dbms_xmldom.domnode;*/
v_test VARCHAR2(255);
BEGIN
l_obj := increasecreditafterremittance();
l_children := dbms_xmldom.getchildnodes(p_node);
l_length := dbms_xmldom.getlength(l_children);
FOR l_i IN 0 .. (l_length - 1) LOOP
l_child := dbms_xmldom.item(l_children, l_i);
IF dbms_xmldom.getnodetype(l_child) != dbms_xmldom.element_node THEN
CONTINUE;
END IF;
l_name := dbms_xmldom.getlocalname(dbms_xmldom.makeelement(l_child));
IF l_name = 'LeagueCompanyId' THEN
l_decode_result := soapdeccommon.decode_string(l_child);
l_obj.leaguecompanyid := l_decode_result;
END IF;
IF l_name = 'CompanyId' THEN
l_decode_result := soapdeccommon.decode_string(l_child);
l_obj.companyid := l_decode_result;
END IF;
IF l_name = 'RemittanceValue' THEN
l_decode_result := soapdeccommon.decode_int(l_child);
l_obj.remittancevalue := l_decode_result;
END IF;
IF l_name = 'RemittanceToken' THEN
l_decode_result := soapdeccommon.decode_string(l_child);
l_obj.remittancetoken := l_decode_result;
END IF;
IF l_name = 'RemittanceDateTime' THEN
l_decode_result := soapdeccommon.decode_string(l_child);
l_obj.remittancedatetime := l_decode_result;
END IF;
IF l_name = 'Remark' THEN
l_decode_result := soapdeccommon.decode_string(l_child);
l_obj.remark := l_decode_result;
END IF;
IF l_name = 'test1' THEN
/*raise_application_error(-20201,
'soapdeccommon.decode_string(l_child1)');*/
l_children1 := dbms_xmldom.getchildnodes(l_child);
l_length1 := dbms_xmldom.getlength(l_children1);
FOR idx IN 0 .. (l_length1 - 1) LOOP
l_child1 := dbms_xmldom.item(l_children1, idx);
IF dbms_xmldom.getnodetype(l_child1) !=
dbms_xmldom.element_node THEN
CONTINUE;
END IF;
l_name := dbms_xmldom.getlocalname(dbms_xmldom.makeelement(l_child1));
IF l_name = 'Remark1' THEN
v_test := v_test || '--' ||
soapdeccommon.decode_string(l_child1);
END IF;
END LOOP;
raise_application_error(-20201, 'v_test:' || v_test);
END IF;
IF l_name = 'orderLines' THEN
l_children1 := dbms_xmldom.getchildnodes(l_child);
l_length1 := dbms_xmldom.getlength(l_children1);
FOR idx IN 0 .. (l_length1 - 1) LOOP
l_child1 := dbms_xmldom.item(l_children1, idx);
IF dbms_xmldom.getnodetype(l_child1) !=
dbms_xmldom.element_node THEN
CONTINUE;
END IF;
l_name := dbms_xmldom.getlocalname(dbms_xmldom.makeelement(l_child1));
IF l_name = 'orderLine' THEN
l_children2 := dbms_xmldom.getchildnodes(l_child1);
l_length2 := dbms_xmldom.getlength(l_children2);
FOR idx1 IN 0 .. (l_length2 - 1) LOOP
l_child2 := dbms_xmldom.item(l_children2, idx1);
IF dbms_xmldom.getnodetype(l_child2) !=
dbms_xmldom.element_node THEN
CONTINUE;
END IF;
l_name := dbms_xmldom.getlocalname(dbms_xmldom.makeelement(l_child2));
IF l_name = 'itemCode' THEN
v_test := v_test || '--' ||
soapdeccommon.decode_string(l_child2);
END IF;
IF l_name = 'actualQty' THEN
v_test := v_test || '--' ||
soapdeccommon.decode_string(l_child2);
END IF;
END LOOP;
END IF;
END LOOP;
raise_application_error(-20201, 'v_test:' || v_test);
END IF;
END LOOP;
RETURN l_obj;
END;
3:测试用例
declare
request_clob clob :='<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:test>
<ns1:Remark1>123</ns1:Remark1>
<ns1:Remark1>456</ns1:Remark1>
</ns1:test>
<orderLines>
<orderLine>
<orderLineNo></orderLineNo>
<ownerCode>QBXA019</ownerCode>
<itemCode>27313011617033329</itemCode>
<planQty>0</planQty>
<actualQty>1</actualQty>
</orderLine>
<orderLine>
<orderLineNo></orderLineNo>
<ownerCode>QBXA019</ownerCode>
<itemCode>27313011617033339</itemCode>
<planQty>0</planQty>
<actualQty>1</actualQty>
</orderLine>
</orderLines>
</ns1:RemittanceParameterItem>
</ns1:parameters>
</ns1:IncreaseCreditAfterRemittance>';
req_doc DBMS_XMLDOM.domdocument;
requestNode XMLDOM.domnode;
l_request increasecreditafterremittance;
begin
l_request := increasecreditafterremittance();
req_doc := dbms_xmldom.newDOMDocument (request_clob);
requestNode := XMLDOM.item (xmldom.getelementsbytagname (req_doc,'RemittanceParameterItem'), 0);
l_request := decd_incr_creditafremittance1(requestNode);
--raise_application_error(-20201,'l_request.LeagueCompanyId:'||l_request.leaguecompanyid||'--'||'l_request.CompanyId:'||l_request.CompanyId||'--'||'l_request.RemittanceValue:'||l_request.RemittanceValue);
end;