微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PLSQL 解析XML文件

select *
from all_directories CREATE DIRECTORY XML_DIR AS '/app/oracle/database/dir';
--创建测试表
create table test_xml(id number(2),content xmltype);
----将数据从文件读入数据库
INSERT INTO test_xml VALUES (1,XMLType(bfilename('XML_DIR','1.xml'),1));
--以clob形式读取xmltype字段
select id,x.content.getCLOBVal() from test_xml x;
--以string形式读取xmltype字段
select id,x.content.getstringVal() from test_xml x;
--判断节点存在性.
select * from test_xml t where existsNode(t.content,'/book') = 1;
--读取节点值
select id,extractvalue(content,'/book/title') from test_xml;

/**读取节点值同上(对于非xmltype型的字段,可先使用xmltype转换类型后,
**采用该种方式取值,即xmltype(表别名.字段名).extract(xmlpath))
**/
select id,x.content.extract('/book/title') from test_xml x;

--将查询结果转为xml格式.
SELECT DBMS_XMLGEN.getxml('select * from test_xml') xml_text FROM DUAL;





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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。