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

上周遇到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类:

package com.wj;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class DbUtil {
    /**
     * @throws SQLException
     * @Title: getConnection
     * @Description: 取得Connection
     * @param @return
     * @return Connection
     * @throws
     */
    public static Connection 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();
        }
        return conn;

    }

    public static void close(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

package com.wj;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class TestXMLImport {

    public static void main(String[] args) throws SQLException {
        // 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);
 NSRSBH varchar2(200);
 NSRMC varchar2(500);
 PJND varchar2(200);
 TRANS_DM_TONG_INSERTDATE TIMESTAMP(6);
 tmp integer;
 --================================
 BEGIN
   xmlPar := 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-1
   LOOP
     --获取第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;
   END LOOP;
   -- 释放文档对象
   xmldom.freeDocument(doc);
   EXCEPTION
    WHEN OTHERS THEN
      DBMS_output.PUT_LINE(SQLERRM);
 END addRow;
运行:
call addRow(‘D:/DEMO/ANS.xml‘,‘D:/DEMO/xmllog.txt‘);

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

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

时间: 2024-08-13 21:24:04

工作小结:xml文件导入到oracle的相关文章

【DRP】采用dom4j完成XML文件导入数据库

xml文件在现在的web开发中扮演着重要的角色,从数据库连接配置到其他各种参数的设置,xml文件在反射技术的应用中举足轻重,也正因为xml文件中保存着如此重要的参数,所以对xml文件的读写操作就显得更加重要.下面我们重点讲解一下dom4j完成XML文件导入数据库. 0.带读取的xml文件如下: 1.利用PL/SQL导入SQL脚本,建立Oracle数据库表(表T_XML)结构,用于接收xml导入的数据 2.按照下图,建立目录并导入相应文件 通过引入的相关jar包,实现dom4j技术解析xml文件(

如何将XML文件导入Excel中

如下图所示为一个规范的XML文件,在Excel中可以将规范的XML文件导入到Excel成为规范的表格.具体有如下几种方法: 工具/原料 Excel 方法/步骤 单击“数据”选项卡下的“获取外部数据”工作组中的“自其他来源”下的“来自XML数据导入”,如下图所示   如下图所示,在弹出的“获取数据源”的对话框中找到要导入的XML文件,后单击“打开”按钮.   单击“打开”按钮后将弹出如下图所示的提示,直接单击“确定”按钮.在弹出的“导入数据”对话框中可以选择是放置在“现有工作表”还是“新的工作表”

【java项目实战】dom4j解析xml文件,连接Oracle数据库

简介 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方,我们还是看一下官方给出的解释.如下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT等语言的库.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP等编程标准. 特点 dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例

SpringIOC注入模块中xml文件导入其他xml文件配置

如果我们在spring框架中配置了多个xml文件,我们可以在读取配置文件的时候把这些xml文件一下全都读取 也可以只读一个总的xml文件,在这个总的xml文件中把其他的xml全都都导入进来. 例如: student.xml文件: <bean name="student" class="com.briup.bean.Student"> <property name="id"> <value>25</valu

Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题

近期的项目中,需要将hadoop运行完成的结果(存在于hdfs上)导入到oracle中,但是在用sqoop导入hdfs中的日期字段'2016-03-01'时,sqoop报错,说date类型必须为'yyyy-mm-dd HH:MM:SS.ffffffff'. 难道sqoop不支持自定义to_date函数么,于是我开始在网上寻求答案,但几乎找不到相关的资料,直到我在sqoop官网上看到如下的信息: sqoop导入date类型到oracle上时,只支持全格式的时间类型!!! 在这里贴出这个问题,希望对

springMVC框架 springmvc-config.xml文件 导入beans、context、mvc命名空间后报错:xml页面开头报错Multiple annotations found at this line

根据网上给出的解决方案,可以解决 1.调出MyEclipse的preference,按照如下图示配置 2.配置好之后,就可以在springmvc-congig.xml文件中引入如下命名空间了 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="

xml文件导入 sql数据库

xml <?xml version="1.0" encoding="utf-8" ?> <!--H5 channelsource--> <items> <item key="55558962" value="client/android/mumayi" version="509.000" url="http://download.ctrip.com/cli

mybatis mapper xml文件的导入方式和查询方式

mybatis mapper xml文件的导入方式和查询方式 ssm框架 Mybatis mapper与SQLSession的关系 每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的.通过SqlSessionFactory可以获得SQLSession实例,然后在其中完全包含了数据库执行SQL命令所需要的所有方法. SQLMapper是由一个Java接口和XML文件构成的,给出一定的SQL和映射规则.负责SQL的执行和返回结果. 通过SQLSession获得Ma

zabbix高级玩法之通过xml文件一次性导入

author:headsen  chen date: 2018-11-10  10:08:38 背景:zabbix的硬件监控架构已经部署完成,接下来就是创建主机这一步,2400台主机如果采用一台台的创建和关联模板就太慢了.硬件监控不用于agent方式,agent的方式可以采用添加自动发现的规则来自动注册. 硬件监控采用 server端通过SNMP服务去各个物理机的管理卡上去抓相应的硬件信息.所以无法通过自动发现规则来添加主机 1,手动添加一台主机,导出该主机的xml配置信息: <zabbix_e