oracle解析xml.doc_第1页
oracle解析xml.doc_第2页
oracle解析xml.doc_第3页
oracle解析xml.doc_第4页
oracle解析xml.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ORACLE中解析XML、 引言本文主要阐述一种在ORACLE中解析XML的实现方法。在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。2、 现象描述当前,XML数据格式越来越多的应用于各种业务信息系统以及数据交换等应用范围,XML数据变得更加常见以及应用更为广泛。在oracle8i以及后期的版本中,开始提供了xmldom方式来实现对XML格式数据的处理,但在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。3、 处理过程XML数据可以为字符串(适合处理较小的xml数据)、物理文件或CLOB字段(处理较大的xml数据字段);以如下的XML数据为例来描述该解析处理过程。XML数据格式示例如下:? - - - 单位名称JXDL - 年新增归档数330/步骤1:定义或确定要解析的XML规则,如上。步骤2:创建XML解析器实例XMLPARSER.parser,如下:xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;步骤3:定义DOM文档对象,如下:doc xmldom.DOMDocument;步骤4:定义解析XML所需要的其他对象,如下: lenUnit integer;lenItem integer;unitNodes xmldom.DOMNodeList;itemNodes xmldom.DOMNodeList;chilNodes xmldom.DOMNodeList;tempNode_unit xmldom.DOMNode;tempNode xmldom.DOMNode;tempArrMap xmldom.DOMNamedNodeMap;-=-以下变量用于获取XML节点的值name varchar2(50);value varchar2(20);tmp integer;-=xmlClobData clob;步骤5:获取xml数据,以下假设从数据表的clob字段中获取取,如下:select datastring into xmlClobData from p_xml_datainfo t where ;步骤6:解析xml数据,如下xmlPar := xmlparser.newParser;-xmlparser.parseBuffer(xmlPar,xmlString);- xmlparser.parseClob(xmlPar,xmlClobData);doc := xmlparser.getDocument( xmlPar );- 释放解析器实例xmlparser.freeParser(xmlPar);- 获取所有unit元素unitNodes := xmldom.getElementsByTagName( doc, unit );lenUnit := xmldom.getLength( unitNodes );-遍历所有unit元素FOR i in 0.lenUnit-1LOOP-获取第i个unittempNode_unit := xmldom.item( unitNodes, i ); itemNodes:=xmldom.getChildNodes(tempNode_unit); lenItem := xmldom.getLength( itemNodes ); FOR j in 0.lenItem-1LOOPtempNode := xmldom.item( itemNodes, j );-获取子元素的值chilNodes := xmldom.getChildNodes(tempNode); tmp := xmldom.GETLENGTH( chilNodes ); name :=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 );value :=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 );DBMS_output.PUT_LINE(i|j,name,value); end loop;END LOOP;步骤7:释放文档对象xmldom.freeDocument(doc);步骤8:异常与错误处理EXCEPTIONWHEN OTHERS THENDBMS_output.PUT_LINE(SQLERRM);4、 原因分析目前,在实际的业务信息系统应用开发中,更多的都习惯在程序中(如java,.net等开发语言提供的xml组件)来解析XML数据,很少直接在ORACLE数据库中来直接解析XML数据。5、 经验总结 通过在ORACLE数据库中直接解析XML数据,能够更方便灵活的处理xml数据,包括创建方法function,存储过程procedure,以及作业JOB,尤其是处理已经存储在数据表中的XML数据。示例:CREATE OR REPLACE PROCEDURECRM_TEMP.P_sys_EmployeesRoleInsert(strxml VARCHAR2,CreateID VARCHAR2,CreateIP VARCHAR2,CreateMacAddress VARCHAR2,CurApmodelID VARCHAR2,HRSiteID VARCHAR2)IStmpVar NUMBER;xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER; doc xmldom.DOMDocument;pNodes xmldom.DOMNodeList;tempNode xmldom.DOMNode;tempArrMap xmldom.DOMNamedNodeMap;tempRolelID nvarchar2(128);tempWorkNO nvarchar2(128);len int;n int ;v_RoleModelID NVARCHAR2(128);v_RolelID NVARCHAR2(128);v_APModelID NVARCHAR2(128);v_FunctionCode NVARCHAR2(128);v_PAPModelID NVARCHAR2(128);v_Count NVARCHAR2(64);I_CreateID NVARCHAR2(128); I_CreateIP NVARCHAR2(128);I_CreateMacAddress NVARCHAR2(128);I_CurApmodelID NVARCHAR2(128);I_HRSiteID NVARCHAR2(128);BEGINIF strxml is not null THENBEGINI_CreateID := CreateID;I_CreateIP := CreateIP;I_CreateMacAddress := CreateMacAddress; I_CurApmodelID := CurApmodelID;I_HRSiteID := HRSiteID;v_Count := 0;XMLPARSER.PARSECLOB(xmlPar,strxml);doc:=XMLPARSER.getDocument( xmlPar );XMLPARSER.FREEPARSER(xmlPar);pNodes:=xmldom.getElementsByTagName(doc, tempWorkNO );len:=xmldom.getLength(pNodes);tempNode := xmldom.item( pNodes, 0 );tempArrMap := xmldom.getAttributes(tempNode);tempRolelID:=xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,tempRolelID);tempWorkNO :=xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,tempWorkNO);DELETEFROM Sys_RoleEmployees aWHERE a.WORKNO = tempWorkNO AND a.HRSiteID=I_HRSiteID;FOR i in 0.len-1LOOPtempNode := xmldom.item( pNodes, i ); tempArrMap :=xmldom.getAttributes(tempNode);tempRolelID:=xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,tempRolelID);tempWorkNO :=xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,tempWorkNO);INSERT INTO Sys_RoleEmployees(RoleEmployeesID,RolelID,WORKNO,createID,CreateIP,CreateMacAddress,CurApmodelID,HRSiteID)VALUES(SYS_GUID(),tempRolelID,tempWorkNO,I_CreateID,I_CreateIP,I_CreateMacAddress,I_CurApmodelID,I_HRSiteID);Commit;END LOOP;END;END IF;EXCEPTIONWHEN NO_DATA_FOUND THENNULL;WHEN OTHERS THENROLLBACK;RAISE;END P_sys_EmployeesRoleInsert; /示例2.12 3 4 Tony Blair5 10 Downing Street, London, UK 6 (061) 987657 (061) 987688 9 10 11 Bill Clinton12 White House, USA 13 (001) 6400 9876514 (001) 6400 9876915 16 17 18 Tom Cruise19 57 Jumbo Street, New York, USA20 (001) 4500 6785921 (001) 4500 6789522 23 24 25 Linda Goodman26 78 Crax Lane, London, UK27 (061) 54 5678928 (061) 54 5677229 30 31 我以scott用户为例,新建表:1 CREATE TABLE PEOPLE2 (3 PERSONID VARCHAR2(4) PRIMARY KEY,4 NAME VARCHAR2(50),5 ADDRESS VARCHAR2(200),6 TEL VARCHAR2(20),7 FAX VARCHAR2(20),8 EMAIL VARCHAR2(100)9 );解析并持久化的存储过程代码:*file_path 需要解析的XML文件路径 如:D:OracleTestpeople.xml 3 *log_path 保存日志的文件的路径 如: D:OracleTestxmllog.txt 4 */56 CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)7 AS8 -/XML解析器9 xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;10 -/DOM文档对象11 doc xmldom.DOMDocument;12 len integer;13 personNodes xmldom.DOMNodeList;14 chilNodes xmldom.DOMNodeList;15 tempNode xmldom.DOMNode;16 tempArrMap xmldom.DOMNamedNodeMap;17 -=18 -以下变量用于获取XML节点的值19 pid varchar2(4);20 name varchar2(50);21 address varchar2(200);22 tel varchar2(20);23 fax varchar2(20);24 email varchar(100);25 tmp integer;26 -=27 BEGIN28 xmlPar := xmlparser.newParser;29 xmlparser.setErrorLog( xmlPar, log_path);30 xmlparser.parse(xmlPar, file_path);31 doc := xmlparser.getDocument( xmlPar );32 - 释放解析器实例33 xmlparser.freeParser(xmlPar);34 - 获取所有PERSON元素35 personNodes := xmldom.getElementsByTagName( doc, PERSON );36 len := xmldom.getLength( personNodes );37 -遍历所有PERSON元素38 FOR i in 0.len-139 LOOP40 -获取第i个PERSON41 tempNode := xmldom.item( personNodes, i );42 -所有属性43 tempArrMap := xmldom.getAttributes(tempNode);44 -获取PERSONID的值45 pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,PERSONID);46 -获取子元素的值47 chilNodes := xmldom.getChi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论