上周遇到xml文件导入到oracle数据库中,发现正常的xml转成excle格式导入,只针对于1m以下的xml文件。当xml文件太大的时候,就没有作用了。
这时候,我找到了两种办法,一个是java,一个是数据库的存储过程,但是数据库的存储过程还有些问题,需要自己琢磨一会。
现在就展示java的用法将xml文件导入到oracle数据库中:
首先需要三个jar包:
dom4j-1.6.1.jar(因为采用dom4j辅助存入,所以这个是必要的)
jaxen-1.1.1.jar(使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法)
ojdbc6.jar(和数据库打交道)
jar包可以直接在maven官网中下载,方便快捷。
导入到数据库的xml文件的格式为:
一: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);
}
}
}
这样就可以将数据导入到数据库里面了,亲测有效。
下面放出我困惑很久的存储过程(亲测无效,但是我依旧不知道怎么办的) 执行无结果,运行不报错:
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