java实现xml文件读取和写入

2023-10-27

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文件较大的时候,使用边加载边读取的方式,读取速度会明显加快

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现xml文件读取和写入 的相关文章

随机推荐

  • shell中的for循环示例

    1 利用for循环打印 示例代码 bin bash for i 0 i lt 3 i do for j 0 j lt 5 j 每行打印5个 打印三行 do echo n done echo done 2 利用for循环计算1到100的和 示
  • python读取xlsx格式的excle

    python读取excle的xlsx和xls格式代码略有不同 import pandas as pd from pandas import DataFrame if name main 读取excle表中的数据 file path r D
  • 【华为OD机试】数字反转打印【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小华是个很有对数字很敏感的小朋友 他觉得数字的不同排列方式有特殊美感 某天 小华突发奇想 如果数字多行排列 第一行1个数 第二行2个 第三行3个 即第n行有n个数字
  • Java高级开发必知必会——反射

    title Java高级开发必知必会 反射 author rocklei123 tags Java 反射 categories Java date 2018 09 16 08 20 57 1 目标与意义 反射是Java开发中一个非常重要的概
  • Linux 之 shell 比较运算符

    运算符 描述 示例 文件比较运算符 e filename 如果 filename 存在 则为真 e var log syslog d filename 如果 filename 为目录 则为真 d tmp mydir f filename 如
  • 日期子组件

    日期子组件 如图
  • MySQL忘记密码的处理方法(MySQL重置密码)

    1 关闭正在运行的MySQL服务 在任务管理器中找到MySQL对应的服务 然后将其停止 2 打开CMD命令行窗口 转到mysql bin目录 3 输入mysqld skip grant tables 回车 mysqld skip grant
  • 《Collaborative Filtering for Implicit...》论文阅读

    论文题目 Collaborative Filtering for Implicit Feedback Datasets 链接 link 1 Introduction 随着电商的快速发展 为用户提供商品的排序很重要 推荐系统就是为用户提供符合
  • Spring Cloud微服务:Loadbalancer 实战

    nacos维护一个列表 但是我们请求服务不可能一个服务所有的都请求一遍 比如我做一笔转账 我找到其中一个做一次转账就够了 而不是看到有多个转账服务 都去转一次 那这个就需要 选择 选择这个靠谁来做呢 其实就是客户端负载均衡组件 Spring
  • git命令添加多个仓库,同步各分支代码,删除仓库、分支

    某些开发场景中 可能会遇到一套代码提交到2套git仓库 此时如何添加一个新仓库呢 假设已有仓库origin 想行添加一个仓库地址 命名为origin test与原仓库区分 1 查看现有仓库名及仓库地址 git remote v 2 添加新远
  • Pandsa时间序列采样频率滑窗及重采样

    目录 Pandas时间序列采样频率滑窗 1 滑窗函数rolling 获取近7天的销售总量 2 shift 及 diff 重采样 resample pandas时间戳及时间差 pandas日期处理DT对象 Pandas时间序列采样频率滑窗 1
  • 提高「程序员」的思维方式

    大家好 我是Tom哥 人和动物的最大区别就是 人具有思维能力 能将大脑里的东西实现出来 而动物则更多停留在模仿阶段 如 鹦鹉学舌 当然 这也是一种进化能力 这里着重提到了思维能力 人与人的思维能力也是有差异的 比如 一线程序员关心的这个项目
  • Oracle RAC failover 测试(连接时故障转移)

    Oracle RAC 集群最突出的表现就是高可用性 这些内容主要包括load balance以及failover 通过这些技术使得单点故障不影响客户端端应用程序对数据库的正常访问 以及通过创建service实现节点间负载均衡 本文主要描述O
  • Node.js 安装第三方模块

    所有的第三方模块包 下载安装的模块 使用的方式都是一样的 此文件以uuid举例 NPM的全称是Node Package Manager 是node的包管理器 是全球最大的开源生态系统 作用就是管理模块包 node模块包可以理解为工具 插件
  • Git常用命令cherry-pick

    Git常用命令cherry pick 将指定的提交应用于其他分支 可以用于恢复不小心撤销 revert reset 的提交 对于多分支的代码库 将代码从一个分支转移到另一个分支是常见需求 这时分两种情况 一种情况是 你需要另一个分支的所有代
  • 【知识点】Java的值传递——为什么对象在函数里修改了,返回后未修改

    问题背景 今天做题 遇到一个代码判断题 结果一直做错 题目如下 public class Point private int x private int y public Point int x int y this x x this y
  • 轻松易懂,一文告诉你什么是http协议?

    阅读本文之前 请详细阅读以下几篇文章 一文包你学会网络数据抓包 教你如何抓取网络中的数据包 黑客必备技能 一 什么是http Http协议即超文本传送协议 HTTP Hypertext transfer protocol 它定义了浏览器 即
  • matlab 10为底指数,matlab指数函数

    手机评站网今天精心准备的是 matlab指数函数 下面是详解 用matlab求指数函数 刚学这课不会经建模得y与t的关系为y a b exp c t 试确定a b c已知x 0 0 1 1 y 2 997 2 480 2 101 1 815
  • Android实现沉浸式状态栏实现在项目中的使用

    不得不说 Android实现沉浸式状态栏确实是一个不深不浅的坑 懂门路的人几分钟就能解决掉 不懂门路的人 网上找资料查资源估计也要个一两天 当然了 我也是苦于其中 不过到最后还是找出来了 ImmersionBar 一个star数超过5K的三
  • java实现xml文件读取和写入

    import java io File import java io FileInputStream import java io FileOutputStream import java io InputStream import jav