读取xml导入到oracle,工作小结:xml文件导入到oracle

上周遇到xml文件导入到oracle数据库中,发现正常的xml转成excle格式导入,只针对于1m以下的xml文件。当xml文件太大的时候,就没有作用了。

这时候,我找到了两种办法,一个是java,一个是数据库的存储过程,但是数据库的存储过程还有些问题,需要自己琢磨一会。

现在就展示java的用法将xml文件导入到oracle数据库中:

首先需要三个jar包:

20181210150021480347.png

dom4j-1.6.1.jar(因为采用dom4j辅助存入,所以这个是必要的)

jaxen-1.1.1.jar(使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法)

ojdbc6.jar(和数据库打交道)

jar包可以直接在maven官网中下载,方便快捷。

导入到数据库的xml文件的格式为:

20181210150021946137.png

20181210150022190262.png

一:DbUtil类:

packagecom.wj;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;public classDbUtil {/***@throwsSQLException

* @Title: getConnection

* @Description: 取得Connection

*@param @return*@returnConnection

*@throws

*/

public staticConnection getConnection() {//加载驱动,使用反射来实现

Connection conn = null;try{//驱动连接

Class.forName("oracle.jdbc.driver.OracleDriver");//连接

String url = "jdbc:oracle:thin:@10.10.54.44:15211:credit";

String username= "creditxf"; //连接数据库的用户名

String password = "credit"; //连接数据库的密码

conn = DriverManager.getConnection(url, username, password); //进行连接

} catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(Exception e) {

e.printStackTrace();

}returnconn;

}public static voidclose(PreparedStatement pstmt, Connection conn) {try{if(conn !=null){

conn.close();

}

}catch(Exception e){

}finally{try{if(pstmt!=null){

pstmt.close();

}

}catch(Exception e){

e.printStackTrace();

}

}

}

}

二:TestXMLImport

packagecom.wj;importjava.io.File;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.util.Iterator;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;public classTestXMLImport {public static void main(String[] args) throwsSQLException {//TODO Auto-generated method stub//执行插入的SQL语句,

String sql="insert into TB_SWZJ_AJNSRMD(NSRSBH, XH, NSRMC, PJND) values (?, ?, ?, ?)";

Connection conn= null;

PreparedStatement pstmt= null;try{

conn=DbUtil.getConnection();

pstmt=conn.prepareStatement(sql);//读取xml文件存放的路径

Document doc=new SAXReader().read(new File("D:\\JAVADEMO\\XML\\xml\\TB_SWZJ_AJNSRMD_00001.xml"));//查找对应的信息,从XMl中找对应的层层关系,我的xml文件中,一开始只是Rows,然后每条数据为Row。

List itemList= doc.selectNodes("/Rows/Row");//遍历

for(Iterator iter=itemList.iterator();iter.hasNext();){

Element el=(Element) iter.next();//使用Element的elementText属性取值,将值一一取出来,这个没有取xml文件中TRANS_DM_TONG_INSERTDATE字段,是因为我需要

系统时间作为时间字段,默认时间为sysdate

String NSRSBH=el.elementText("NSRSBH");

String XH=el.elementText("XH");

String NSRMC=el.elementText("NSRMC");

String PJND=el.elementText("PJND");//通过pstmt赋值

pstmt.setString(1, NSRSBH);

pstmt.setString(2, XH);

pstmt.setString(3,NSRMC);

pstmt.setString(4, PJND);

pstmt.addBatch();

}

pstmt.executeBatch();//提示

System.out.println("将XML导入数据库成功");

}catch(DocumentException e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{//关闭

DbUtil.close(pstmt,conn);

}

}

}

这样就可以将数据导入到数据库里面了,亲测有效。

20181210150022332831.png

下面放出我困惑很久的存储过程(亲测无效,但是我依旧不知道怎么办的) 执行无结果,运行不报错:

CREATE OR REPLACE PROCEDURE addRow(file_path VARCHAR2,log_path VARCHAR2)AS

--//XML解析器

xmlPar XMLPARSER.parser :=XMLPARSER.NEWPARSER;--//DOM文档对象

doc xmldom.DOMDocument;len integer;

RowNodes xmldom.DOMNodeList;

chilNodes xmldom.DOMNodeList;

tempNode xmldom.DOMNode;

tempArrMap xmldom.DOMNamedNodeMap;--================================

--以下变量用于获取XML节点的值

XH varchar2(20);

NSRSBHvarchar2(200);

NSRMCvarchar2(500);

PJNDvarchar2(200);

TRANS_DM_TONG_INSERTDATETIMESTAMP(6);

tmpinteger;--================================

BEGINxmlPar :=xmlparser.newParser;

xmlparser.setErrorLog( xmlPar, log_path);

xmlparser.parse(xmlPar, file_path);

doc :=xmlparser.getDocument( xmlPar );--释放解析器实例

xmlparser.freeParser(xmlPar);--获取所有Row元素

RowNodes := xmldom.getElementsByTagName( doc, ‘Row‘);len :=xmldom.getLength( RowNodes );--遍历所有Row元素

FOR i in 0..len-1LOOP--获取第i个Row

tempNode :=xmldom.item( RowNodes, i );--所有属性

tempArrMap :=xmldom.getAttributes(tempNode);--获取所有子节点

chilNodes :=xmldom.getChildNodes(tempNode);--获取子节点的个数

tmp :=xmldom.GETLENGTH( chilNodes );--获取各个子节点的值

NSRSBH := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0)));

XH := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1)));

NSRMC := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2)));

PJND := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3)));

TRANS_DM_TONG_INSERTDATE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4)));--插入数据

INSERT INTO TB_SWZJ_AJNSRMD VALUES(NSRSBH,XH,NSRMC,PJND,TRANS_DM_TONG_INSERTDATE);COMMIT;ENDLOOP;--释放文档对象

xmldom.freeDocument(doc);

EXCEPTIONWHEN OTHERS THENDBMS_output.PUT_LINE(SQLERRM);END addRow;

运行:

call addRow(‘D:/DEMO/ANS.xml‘,‘D:/DEMO/xmllog.txt‘);

有大哥帮小弟解决 这个问题的,小弟感激不尽。

原文:https://www.cnblogs.com/jianshuai520/p/10096273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值