PLSQL 解析XML文件
select *
create or replace procedure parse_xml_file is p_max_size number := dbms_lob.lobmaxsize;src_offset number := 1; dst_offset number := 1; lang_ctx number := nls_charset_id('UTF8'); default_csid constant integer := nls_charset_id('ZHS16GBK'); warning number; l_file_number pls_integer := 0; l_count number; l_bfile bfile; l_clob clob; l_commitelement xmldom.DOMElement; l_parser dbms_xmlparser.Parser; l_doc dbms_xmldom.DOMDocument; l_nl dbms_xmldom.DOMNodeList; l_n dbms_xmldom.DOMNode; rootnode dbms_xmldom.DOMNode; parent_rootnode dbms_xmldom.DOMNode; file_length number; block_size binary_integer; l_rootnode_name varchar2(200); l_status varchar2(1000); l_recerrcode varchar2(1000); l_failcount varchar2(200); l_reccount varchar2(200); l_name varchar2(1000); l_comments varchar2(2000); l_exists boolean; function convertclobtoxmlelement(p_document in clob) return xmldom.DOMElement is x_commitelement xmldom.DOMElement; l_parser xmlparser.Parser; begin l_parser := xmlparser.newParser; xmlparser.parseClob(l_parser,p_document); x_commitelement := xmldom.getDocumentElement(xmlparser.getDocument(l_parser)); return x_commitelement; end convertclobtoxmlelement; begin utl_file.fgetattr('XML_DIR', '2.xml', l_exists, file_length, block_size); if not l_exists then dbms_output.put_line('XML File not exist!!!'); return; end if; l_bfile := bfilename('XML_DIR','2.xml'); dbms_lob.createtemporary(l_clob,true); dbms_lob.open(l_bfile,dbms_lob.lob_readonly); dbms_lob.loadclobfromfile(l_clob, l_bfile, p_max_size, dst_offset, src_offset, default_csid, lang_ctx, warning); l_file_number := dbms_lob.fileexists(l_bfile); if l_file_number = 0 then dbms_output.put_line('XML File Convert Failed!!!'); return; end if; dbms_lob.close(l_bfile); l_parser := dbms_xmlparser.newParser; begin dbms_xmlparser.parseClob(l_parser,l_clob); exception when others then dbms_output.put_Line('XML File Not Full!!!'); return; end; l_doc := dbms_xmlparser.getDocument(l_parser); dbms_lob.freetemporary(l_clob); rootnode := xmldom.makeNode(xmldom.getDocumentElement(xmlparser.getDocument(l_parser))); l_rootnode_name := xmldom.getNodeName(rootnode); dbms_output.put_line('The root node name of the XML File is :' || l_rootnode_name); dbms_xslprocessor.valueOf(rootnode,'RecCount/text()',l_reccount); dbms_xslprocessor.valueOf(rootnode,'FailCount/text()',l_Failcount); dbms_output.put_line('The name of the Current Node in The File is : ' || l_rootnode_name || '''s elements RecCount,FailCount Value is :' || l_reccount || ',' || l_Failcount); l_status := xmldom.getAttribute(xmldom.makeElement(rootnode),'Status'); dbms_output.put_line('The name of the Current Node in The File is : ' || l_rootnode_name || '''s elements Status Value is :' || l_status); l_nl := dbms_xmldom.getElementsByTagName(l_doc,'Item'); l_count := dbms_xmldom.getLength(l_nl); for cur_emp in 0 .. dbms_xmldom.getLength(l_nl) - 1 loop l_n := dbms_xmldom.item(l_nl,cur_emp); dbms_xslprocessor.valueOf(l_n,'Name/text()',l_name); dbms_xslprocessor.valueOf(l_n,'Comment/text()',l_comments); parent_rootnode := dbms_xmldom.getParentNode(l_n); l_rootnode_name := xmldom.getNodeName(parent_rootnode); l_recerrcode := xmldom.getAttribute(xmldom.makeElement(parent_rootnode), 'RecErrCode'); dbms_output.put_line('Name :' || l_name || ',Comment = ' || l_comments || ',RecErrCode = ' || l_recerrcode); end loop; dbms_xmlparser.freeParser(l_parser); dbms_xmldom.freeDocument(l_doc); exception when others then dbms_lob.freetemporary(l_clob); dbms_xmlparser.freeParser(l_parser); dbms_xmldom.freeDocument(l_doc); end;
2.xml <?xml version="1.0" encoding="UTF-8"?> <Dfile Status="3"> <RecCount>200</RecCount> <FailCount>1</FailCount> <FailInfo> <FItem RecErrCode="2901"> <Item> <Name>test1</Name> <Comment>ssss</Comment> </Item> <Item> <Name>test2</Name> <Comment>llll</Comment> </Item> </FItem> </FailInfo> <FailInfo> <FItem RecErrCode="2902"> <Item> <Name>test3</Name> <Comment>sssssdfdfss</Comment> </Item> <Item> <Name>test4</Name> <Comment>llll</Comment> </Item> </FItem> </FailInfo> </Dfile> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |