java实现xml文件读取和写入

本文深入探讨了XML文件的两种读取方式:边加载边读取和一次性读取到内存,以及如何使用Java实现XML文件的数据写入。通过具体代码示例,详细解释了每种方法的工作原理和适用场景,特别指出对于大型XML文件,边加载边读取能显著提高读取速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

 /**
      * xml边加载边读取:第一种读取方式
      * @param file
      * @throws Exception
      */
    public static void XmlSAXReader(File file) throws Exception{
        SAXReader reader  = new SAXReader();
        Document doc = reader.read(file);
        Element root = doc.getRootElement();//xml 节点元素
        List firstList = root.elements();//第二层节点元素 集合
        System.out.println(firstList.size());
        for (Iterator it = firstList.iterator(); it.hasNext();) {
            Element secondelement = (Element) it.next();//第二层节点元素
            List secondList = secondelement.elements();//第三层节点元素  集合
            for (Iterator itsecond = secondList.iterator(); itsecond.hasNext();) {
                Element thirdelement = (Element) itsecond.next();////第三层节点
                 XmlSAXReaderNext( thirdelement );
            }
        }
    }
    
 
    public static int XmlSAXReaderNext(Element thirdelement ) {
        //第四层节点元素集合
        List forthList = thirdelement.elements();
        System.out.println(forthList==null?"0":forthList.size());
        for (Iterator it = forthList.iterator(); it .hasNext();) {
            Element prop = (Element) it.next();//第四层节点元素

                List<DefaultAttribute> l=prop.attributes();//获取节点属性
                 Iterator t= l.iterator();
                 while(t.hasNext()) {
                     DefaultAttribute de=(DefaultAttribute) t.next();
                     System.out.println(de.getName() + ":" + de.getData());/打印属性
                 }

        List l=prop.elements();
            System.out.println(l==null?"0":l.size());
            System.out.println(prop.getName() + ":" + prop.getData());//打印节点名称和内容
        }
        System.out.println();
        return 1;
    }

/**
      * 一次性读取xml文件中所有内容到内存: 第二种读取方式
      */

public static void readXml(String pathName,Connection conn,String preSql){
        InputStream inputStream=null;
        try{
            //创建xml编辑对象
            org.jdom.input.SAXBuilder saxBuilder = new org.jdom.input.SAXBuilder(false);  
            inputStream= new FileInputStream(new File(pathName));//创建文件输入流对象
            org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource(inputStream);//创建xml输入对象
            org.jdom.Document document = saxBuilder.build(inputSource);//获取xml文档对象
            org.jdom.Element rootElement = document.getRootElement();//获取xml根元素(一级节点)
           // String tableId = rootElement.getAttributeValue("time").trim();//获取根属性
            List<org.jdom.Element> rows = rootElement.getChildren("row");//获取子元素集合(二级节点)
            org.jdom.Element row;
            if(rows != null){
                for(int m = 0;m<rows.size();m++){//遍历二级节点
                    row = rows.get(m);
                    List<org.jdom.Element> cols = row.getChildren("col");//获取三级节点集合
                    org.jdom.Element col;
                     if(cols != null){
                         for(int k = 3;k<cols.size();k++){
                             col = cols.get(k);
                                String value= col.getChildText("value").trim();
                                    System.out.println("value:"+value);
                         }
                  }
                }
             }
            inputStream.close();
        }catch(Exception e){
            try{
                if(inputStream!=null)inputStream.close();
            }catch(Exception e1){
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
    }

  public static void closeWriteXml(org.dom4j.io.XMLWriter out ,OutputStreamWriter osw,FileOutputStream fos,Statement stmt,ResultSet rs  ){
        try{
            if (out != null) out.close();
            if (osw != null) osw.close();
            if (fos != null) fos.close();
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    //Java实现xml文件数据写入
    public static void writeXml(String path,Connection conn,String sql){
        org.dom4j.Element row = null;
        org.dom4j.io.XMLWriter out = null;
        OutputStreamWriter osw = null;
        FileOutputStream fos = null;
        Statement stmt=null;
        ResultSet rs =null;
        try {
            stmt=conn.createStatement();
            rs = stmt.executeQuery(sql);//查询数据
            File xmlFile = new File(path);// 指定xml文件全路径,不存在则生成,重复名称则覆盖
            fos = new FileOutputStream(xmlFile);
            osw = new OutputStreamWriter(fos, "UTF-8");// 指定编码,防止写中文乱码

            // 输出格式化
            org.dom4j.io.OutputFormat format = org.dom4j.io.OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            out = new org.dom4j.io.XMLWriter(fos, format);//创建xml输出对象
            out.startDocument();
            org.dom4j.Document document = org.dom4j.DocumentHelper.createDocument();//创建文档对象
            // 添加元素 xml
            org.dom4j.Element xmlElement = document.addElement("table");//增加文档根节点
            xmlElement.addAttribute("time", new Date().getTime()+"");//增加根节点属性
            out.writeOpen(xmlElement);//增加根节点到xml输出对象中
            /**
             * 加载数据
             */
            if (rs != null) {
                ResultSetMetaData md = rs.getMetaData(); // 循环结果集(rs)
                while (rs.next()) {
                    row = org.dom4j.DocumentHelper.createElement("row");
                    for(int i=1;i<=md.getColumnCount();i++){
                        String columnName = md.getColumnName(i);
                        Object values = rs.getObject(columnName);
                        row.addAttribute(columnName, values != null ? values.toString() : "");
                    }
                    out.write(row);//增加二级节点到xml输出对象中
                    row.clearContent();
                }
            }
            out.writeClose(xmlElement);
            xmlElement.clearContent();
            out.endDocument();
            closeWriteXml( out , osw, fos, stmt, rs  );
        } catch (Exception e) {
            closeWriteXml( out , osw, fos, stmt, rs  );
            e.printStackTrace();
        }
    }

注意:xml文件较大的时候,使用边加载边读取的方式,读取速度会明显加快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值