dom4j 读大xml文件

今天由于项目需要,读取一个几百兆的xml文件,直接内存溢出了,主要原因是我一次性读取xml文件的内容造成的,对于大的xml文件还是要读取部分到内存,然后从内存删除,再读取,这里用了dom4j的saxreader


[java]  view plain copy
  1. package test;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.InputStream;  
  6. import java.sql.Connection;  
  7. import java.sql.DriverManager;  
  8. import java.sql.PreparedStatement;  
  9. import java.sql.SQLException;  
  10. import java.text.DateFormat;  
  11. import java.text.SimpleDateFormat;  
  12. import java.util.Date;  
  13.   
  14. import org.apache.commons.codec.binary.Base64;  
  15. import org.dom4j.Element;  
  16. import org.dom4j.ElementHandler;  
  17. import org.dom4j.ElementPath;  
  18. import org.dom4j.io.SAXReader;  
  19.   
  20. public class MySaxHandler implements ElementHandler {  
  21.       
  22.     SAXReader reader;  
  23.       
  24.     static String jdbcURL = "jdbc:sybase:Tds:172.25.130.1:4100/center?charset=cp936";  
  25.     static String jdbcDriver = "com.sybase.jdbc3.jdbc.SybDriver";  
  26.     static String userName = "xxx";  
  27.     static String password = "xxx";  
  28.       
  29.     ThreeYearBlackEnt threeYearBlackEnt = new ThreeYearBlackEnt();  
  30.     public static Connection con = null;  
  31.       
  32.     public static Connection getConnection() throws Exception {  
  33.         Class.forName(jdbcDriver);  
  34.         return DriverManager.getConnection(jdbcURL, userName, password);  
  35.     }  
  36.     public static java.sql.Date stringToDate(String str) {  
  37.         DateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  38.         Date date = null;  
  39.         try {  
  40.             // Fri Feb 24 00:00:00 CST 2012  
  41.             date = format.parse(str);  
  42.         } catch (Exception e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.         // 2012-02-24  
  46.         //date = java.sql.Date.valueOf(str);  
  47.                                                
  48.         return java.sql.Date.valueOf(str);  
  49.     }  
  50.     public static void addDataBackEnt(Connection con,ThreeYearBlackEnt threeYearBlackEnt) throws SQLException{  
  51.         String sql = "insert into J_QYDXB_QG    (QYMC, ZCH,REGORG, FDDBR,FDDBR_ZJHM,FDDBR_ZJMC,DXRQ,BZSM)   values(?, ?, ?, ?, ?,?,?,?)";  
  52.         PreparedStatement pst = con.prepareStatement(sql);  
  53.           
  54.         pst.setString(1, threeYearBlackEnt.ENTNAME);  
  55.         pst.setString(2, threeYearBlackEnt.REGNO);  
  56.         pst.setString(3, threeYearBlackEnt.REGORG);  
  57.         pst.setString(4, threeYearBlackEnt.NAME);  
  58.         pst.setString(5, threeYearBlackEnt.CERNO);  
  59.         pst.setString(6, threeYearBlackEnt.CERTYPE);  
  60.         pst.setDate(7,  stringToDate(threeYearBlackEnt.REVDATE));  
  61.         pst.setString(8, threeYearBlackEnt.ILLEGACT);  
  62.           
  63.         pst.execute();  
  64.         pst.close();  
  65.     }  
  66.       
  67.     public MySaxHandler() {  
  68.         // test.xml文件跟类放在同一目录下  
  69.         try {  
  70.             con = getConnection();  
  71.             InputStream is = MySaxHandler.class.getResourceAsStream("threeYearBlackEnt_data.xml");   
  72.             //InputStream is = new FileInputStream("D:\\programfiles\\workspace\\Counter\\threeYearBlackEnt_data1.xml");  
  73.             reader = new SAXReader();  
  74.             reader.setDefaultHandler(this);  
  75.             reader.read(is);  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80.     public void onEnd(ElementPath ep) {  
  81.         Element element = ep.getCurrent(); //获得当前节点  
  82.         if(element.getName().equals("ENTNAME")) {  
  83.             threeYearBlackEnt.ENTNAME = new String(Base64.decodeBase64(element.getText()));  
  84.             p("ENTNAME="+ threeYearBlackEnt.ENTNAME );  
  85.               
  86.         }else if(element.getName().equals("REGNO")) {  
  87.             threeYearBlackEnt.REGNO = new String(Base64.decodeBase64(element.getText()));  
  88.             p("REGNO="+ threeYearBlackEnt.REGNO);  
  89.               
  90.         }else if(element.getName().equals("REGORG")) {  
  91.             threeYearBlackEnt.REGORG = new String(Base64.decodeBase64(element.getText()));  
  92.             p("REGORG="+ threeYearBlackEnt.REGORG);  
  93.         }else if(element.equals("NAME")) {  
  94.             threeYearBlackEnt.NAME = new String(Base64.decodeBase64(element.getText()));  
  95.             p("NAME="+ threeYearBlackEnt.NAME);  
  96.         }else if(element.getClass().equals("CERNO")) {  
  97.             threeYearBlackEnt.CERNO = new String(Base64.decodeBase64(element.getText()));  
  98.             p("CERNO="+ threeYearBlackEnt.CERNO);  
  99.               
  100.         }else if(element.getName().equals("CERTYPE")){  
  101.             threeYearBlackEnt.CERTYPE = new String(Base64.decodeBase64(element.getText()));  
  102.             p("CERTYPE="+ threeYearBlackEnt.CERTYPE);  
  103.               
  104.         }else if(element.getName().equals("REVDATE")) {  
  105.             threeYearBlackEnt.REVDATE = new String(Base64.decodeBase64(element.getText()));  
  106.             p("REVDATE="+ threeYearBlackEnt.REVDATE);  
  107.               
  108.         }else if(element.getName().equals("ILLEGACT")) {  
  109.             threeYearBlackEnt.ILLEGACT =new String(Base64.decodeBase64(element.getText()));  
  110.             p("ILLEGACT="+ threeYearBlackEnt.ILLEGACT);  
  111.               
  112.             try {  
  113.                 addDataBackEnt(con, threeYearBlackEnt);  
  114.             } catch (SQLException e) {  
  115.                 // TODO Auto-generated catch block  
  116.                 e.printStackTrace();  
  117.             }  
  118.         }  
  119.           
  120.           
  121.           
  122.         element.detach(); //记得从内存中移去  
  123.     }  
  124.   
  125.     public void onStart(ElementPath ep) {  
  126.     }  
  127.       
  128.     public static void main(String[] args){  
  129.         new MySaxHandler();  
  130.     }  
  131.       
  132.     public static void p(Object o) {  
  133.         if(o != null) System.out.println(o.toString());  
  134.     }  
  135.   
  136. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值