拼接XML

 
  
  1. function ApplyDocToXML(docNo in varchar2) return clob is 
  2.   CURSOR c1(dN varchar2) IS 
  3.     SELECT ITEM_ID as DOCUMENT_ID, 
  4.            DOC_NAME as FILE_NAME, 
  5.            DOCUMENT_NAME, 
  6.            DOC_FILE as FILE_CONTENT 
  7.       FROM SupApplyDoc 
  8.      WHERE DOC_NO = dN
  9.   docItem  c1%rowtype; 
  10.   fileClob clob; 
  11.   tempClob clob; 
  12.   resClob  clob; 
  13. begin 
  14.   dbms_lob.createtemporary(tempClob, FALSE, dbms_lob.call); 
  15.   dbms_lob.append(tempClob, 
  16.                   '<?xml version="1.0" encoding="GBK"?><DOCUMENTDATA>');  
  17.   open c1(docNo); 
  18.   loop 
  19.     fetch c1 
  20.       into docItem; 
  21.     exit when c1%notfound; 
  22.     dbms_lob.append(tempClob, 
  23.                     '<DOCUMENT><DOCUMENT_ID>' || docItem.document_id || 
  24.                     '</DOCUMENT_ID><DOCUMENT_NAME>' || 
  25.                     docItem.document_name || '</DOCUMENT_NAME><FILE_NAME>' || 
  26.                     docItem.file_name || 
  27.                     '</FILE_NAME><FILE_CONTENT><![CDATA['); -- CDATA 子集一定要这样写 
  28.     if docItem.file_content is not null then 
  29.       fileClob := Centit_LOB.BlobToBase64(docItem.file_content); 
  30.       dbms_lob.append(tempClob, fileClob); 
  31.       --insert into tmp_lob (n,vn,cv,bv) values(nc.nextval,docItem.file_name,fileClob,docItem.file_content); 
  32.     end if; 
  33.     dbms_lob.append(tempClob, ']]></FILE_CONTENT></DOCUMENT>'); --  
  34.   end loop; 
  35.   if c1%isopen then 
  36.     close c1; 
  37.   end if; 
  38.   dbms_lob.append(tempClob, '</DOCUMENTDATA>'); 
  39.   --write_clob_to_file(result,'testApp.xml'); 
  40.   --9i 无法将Clob写入文件,用一个临时表测试,这个表用后删除,见表语句如下 
  41.   /* 
  42.   create table tmp_lob (n number(10) not null primary key,vn varchar2(250), cv clob, bv blob); 
  43.    create sequence nc ; 
  44.   */ 
  45.   --insert into tmp_lob (n,cv) values(nc.nextval,result); 
  46.   dbms_output.put_line('执行完成'); 
  47.   resClob :tempClob
  48.   dbms_lob.freetemporary(tempClob); 
  49.   return resClob; 
  50. end; 

解析XML

 
  
  1. procedure XMLToApplyDoc(docNo in varchar2, xmlFile in clob) is 
  2.   theXmlDoc   xmldom.DOMDocument; 
  3.   theDocElt   xmldom.DOMElement; 
  4.   docNodeList xmldom.DOMNodeList; 
  5.   docItem     xmldom.DOMNode; 
  6.   --tempElt     xmldom.DOMElement;  
  7.   tempNodeList xmldom.DOMNodeList; 
  8.   tempNode     xmldom.DOMNode; 
  9.   i            number; 
  10.   len          number; 
  11.   j            number; 
  12.   clen         number; 
  13.   fileNode     xmldom.DOMNode; 
  14.   fileCon      clob; 
  15.   fileClob     clob; 
  16.   parser       xmlparser.Parser; 
  17.   docRec       SupApplyDoc%rowtype; 
  18.   nodeName     varchar2(256); 
  19.   XMLParseError EXCEPTION; 
  20.   --PRAGMA EXCEPTION_INIT( XMLParseError, -20100 ); 
  21. begin 
  22.   parser :xmlparser.newParser; 
  23.   --dbms_output.put_line('初始化成功'); 
  24.   xmlparser.parseClob(parser, xmlFile); 
  25.   --dbms_output.put_line('解释XML成功'); 
  26.   theXmlDoc :xmlparser.getDocument(parser); 
  27.   xmlparser.freeParser(parser); 
  28.   if xmldom.IsNull(theXmlDoc) then 
  29.     return; 
  30.   end if; 
  31.   theDocElt   :xmldom.getDocumentElement(theXmlDoc); 
  32.   docNodeList :xmldom.GETELEMENTSBYTAGNAME(theDocElt, 'DOCUMENT'); -- '*' 表示所有元素,包括根元素  
  33.   len         :xmldom.getLength(docNodeList); 
  34.   -- 遍历所有元素  
  35.   for i in 0 .. len - 1 loop 
  36.     docItem :xmldom.item(docNodeList, i); 
  37.     --tempElt :xmldom.makeElement(docItem);  
  38.     tempNodeList  :xmldom.getChildNodes(docItem); 
  39.     docRec.Doc_No :docNo
  40.     clen          :xmldom.getLength(tempNodeList); 
  41.     for j in 0 .. clen - 1 loop 
  42.       tempNode :xmldom.item(tempNodeList, j); 
  43.       nodeName :xmldom.getNodeName(tempNode); 
  44.       --情况结构中的内容 
  45.       docRec.Doc_File :null
  46.       --dbms_output.put_line(nodeName); 
  47.       --这儿录入字段对应关系 
  48.       CASE nodeName 
  49.         WHEN 'DOCUMENT_ID' THEN 
  50.           -- 必需要加一个xmldom.getFirstChild,Oracle中的DOM将Value作为Node的一个子Node  
  51.           docRec.Item_Id :xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); 
  52.           --dbms_output.put_line(docRec.Item_Id); 
  53.         WHEN 'DOCUMENT_NAME' THEN 
  54.           docRec.Document_Name :xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); 
  55.           --dbms_output.put_line(docRec.Document_Name); 
  56.         WHEN 'FILE_NAME' THEN 
  57.           docRec.Doc_Name :xmldom.getNodeValue(xmldom.getFirstChild(tempNode)); 
  58.           --dbms_output.put_line(docRec.Doc_Name); 
  59.         WHEN 'FILE_CONTENT' THEN 
  60.           begin 
  61.             fileNode :xmldom.getFirstChild(tempNode); 
  62.             if not xmldom.IsNull(fileNode) then 
  63.               dbms_lob.createtemporary(fileCon, FALSE, dbms_lob.call); 
  64.               xmldom.writeToClob(xmldom.getFirstChild(tempNode), fileCon); 
  65.               fileClob :fileCon; --xmldom.getNodeValue(xmldom.getFirstChild(tempNode)) ;-- fileCon; 
  66.               dbms_lob.freetemporary(fileCon); 
  67.               docRec.Doc_File :Centit_LOB.Base64ToBlob(fileClob); 
  68.               --dbms_output.put_line('Clob len: '||to_char(dbms_lob.getlength(fileClob))||' Blob len: '||to_char(dbms_lob.getlength(docRec.Doc_File )));          
  69.             end if; 
  70.           end; 
  71.       END CASE; end loop; 
  72.     --dbms_lob.write 
  73.     --dbms_output.put_line(docRec.Doc_Name); 
  74.     --write_clob_to_file(fileCon,docRec.Doc_Name);      
  75.     if (docRec.Doc_File is not null) then 
  76.       insert into tmp_lob 
  77.         (n, vn, cv, bv) 
  78.       values 
  79.         (nc.nextval, docRec.Doc_Name, fileClob, docRec.Doc_File); 
  80.     end if; 
  81.    
  82.   -- 将附件插入到数据库中 
  83.   end loop; 
  84.   null; 
  85.   xmlparser.freeParser(parser); 
  86.   dbms_output.put_line('解释XML完成'); 
  87.   --EXCEPTION 
  88.   --WHEN XMLParseError THEN 
  89.   -- xmlparser.freeParser(parser); 
  90.   --dbms_output.put_line('解释XML出错'); 
  91.   --记录XML分析错误 
  92. end;