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>





你可能感兴趣的:(PLSQL 解析XML文件)