JAVA对XML文件的读写(有具体的代码和解析)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享。xml指令 处理指令,简称PI (processing instruction)。

XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享。

xml指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
以下为例:

进入主题了

首先要有一个xml文件为名字为emplist.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="">
        <name>张三</name>
        <age></age>
        <gender></gender>
    <salary>5000</salary>
    </emp>

</list>
AI 代码解读

XML解析方式

SAX解析方式

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。 其优缺点分别为:
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改

DOM解析方式

DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中
的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。其优缺点分别为:
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长

SAXReader读取XML文档

使用SAXReader需要导入dom4j-full.jar包。其是DOM4J的一个核心API,用于读取XML文档。
DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强
大和极端易用使用的特点,同时它也是一个开放源代码的软件。

package day12;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

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

/**
 * 使用DOM解析xml文档
 * @author ylg
 *
 */
public class ParseXmlDemo {
    public static void main(String[] args) {
        try {
            /*
             * 解析XML大致流程
             * 1:创建SAXReader
             * 2:使用SAXReader读取数据源(xml文档信息)
             *   并生成一个Document对象,该对象即表示
             *   xml文档内容。DOM耗时耗内存资源也是在
             *   这一步体现的。因为会对整个XML文档进行
             *   读取并载入内存。
             * 3:通过Document对象获取根元素
             * 4:根据XML文档结构从根元素开始逐层获取
             *   子元素最终以达到遍历XML文档内容的目的
             *
             */
            //1
            SAXReader reader = new SAXReader();

            //2
            Document doc
             = reader.read(new File("emplist.xml"));

            /*
             * 3
             * Document提供了方法:
             * Element getRootElement()
             * 该方法是用来获取XML文档中的根元素,
             * 对于emplist.xml文档而言,根元素就是
             * <list>标签。
             *
             * Element类
             * 每一个Element实例都可以表示XML文档中的
             * 一个元素,即:一对标签。
             */
            Element root = doc.getRootElement();
            /*
             * Element提供了方法:
             * String getName()
             * 该方法可以获取当前元素的名字(标签名)
             */
            System.out.println(
                "获取了根元素:"+root.getName()
            );
            //4
            /*
             * 获取一个元素中的子元素
             * Element提供了相关方法:
             *
             * 1
             * Element element(String name)
             * 获取当前元素下指定名字的子元素。
             *
             * 2:
             * List elements()
             * 获取当前元素下所有子元素
             *
             * 3:
             * List elements(String name)
             * 获取当前元素下所有同名子元素
             *
             * 2,3返回的集合中的每一个元素都是Element
             * 的实例,每个实例表示其中的一个子元素。
             *
             */
            //获取所有emp标签
            List<Element> list = root.elements();

            //用于保存所有员工信息的List集合
            List<Emp> empList = new ArrayList<Emp>();

            for(Element empEle : list){
//              System.out.println(empEle.getName());
                //获取员工名字
                Element nameEle = empEle.element("name");
                /*
                 * Element还提供了获取当前元素中文本的方法:
                 * String getText(),String getTextTrim()
                 */
                String name = nameEle.getText();
                System.out.println("name:"+name);

                //获取员工年龄
                int age = Integer.parseInt(
                    empEle.elementText("age")
                );

                //获取性别
                String gender = empEle.elementText("gender");

                //获取工资
                int salary = Integer.parseInt(
                    empEle.elementText("salary")
                );
                /*
                 * Attribute attribute(String name)
                 * 获取当前元素(标签)中指定名字的属性
                 *
                 * Attribute的每一个实例用于表示一个
                 * 属性。其中常用方法:
                 * String getName():获取属性名
                 * String getValue():获取属性值
                 */
                Attribute attr
                    = empEle.attribute("id");
                int id = Integer.parseInt(
                    attr.getValue()
                );

                Emp emp = new Emp(id,name,age,gender,salary);
                empList.add(emp);
            }
            System.out.println("解析完毕!");
            for(Emp emp : empList){
                System.out.println(emp);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


AI 代码解读

写XML

构建Document对象
使用DOM4J我们还可以通过自行构建Document对象,并组建树状结构来描述一个XML文档,并使用DOM4J将其写入一个文件。

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
 * 使用DOM生成XML文档
 * @author ylg
 *
 */
public class WriteXmlDemo {
    public static void main(String[] args) {
        List<Emp> list = new ArrayList<Emp>();
        list.add(new Emp(1,"张三",25,"男",5000));
        list.add(new Emp(2,"李四",26,"女",6000));
        list.add(new Emp(3,"王五",27,"男",7000));
        list.add(new Emp(4,"赵六",28,"女",8000));
        list.add(new Emp(5,"钱七",29,"男",9000));
        /*
         * 使用DOM生成XML文档的大致步骤:
         * 1:创建一个Document对象表示一个空文档
         * 2:向Document中添加根元素
         * 3:按照文档应有的结构从根元素开始顺序添加
         *   子元素来形成该文档结构。
         * 4:创建XmlWriter对象
         * 5:将Document对象写出
         *   若写入到文件中则形成一个xml文件
         *   也可以写出到网络中作为传输数据使用  
         */

        //1
        Document doc 
            = DocumentHelper.createDocument();

        /*
         * 2
         * Document提供了添加根元素的方法:
         * Element addElement(String name)
         * 向当前文档中添加指定名字的根元素,返回
         * 的Element就表示这个根元素。
         * 需要注意,该方法只能调用一次,因为一个
         * 文档只能有一个根元素。
         */
        Element root = doc.addElement("list");

        //3
        for(Emp emp : list){
            /*
             * Element也提供了追加子元素的方法:
             * Element addElement(String name)
             * 调用次数没有限制,元素可以包含若干
             * 子元素。
             */
            Element empEle = root.addElement("emp");

            //添加name信息
            Element nameEle = empEle.addElement("name");
            nameEle.addText(emp.getName());

            //添加age信息
            Element ageEle = empEle.addElement("age");
            ageEle.addText(emp.getAge()+"");

            //添加gender信息
            Element genderEle = empEle.addElement("gender");
            genderEle.addText(emp.getGender());

            //添加salary信息
            Element salEle = empEle.addElement("salary");
            salEle.addText(emp.getSalary()+"");

            /*
             * 向当前元素中添加指定名字以及对应值的属性
             */
            empEle.addAttribute("id", emp.getId()+"");

        }
        try{
            //4
            XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
            FileOutputStream fos
                = new FileOutputStream("myemp.xml");
            writer.setOutputStream(fos);

            //5
            writer.write(doc);
            System.out.println("写出完毕!");
            writer.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

AI 代码解读

注意事项:

XPath 路径表达式
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。由于我们单纯使用dom定位节点时,大部
分时间需要一层一层的处理,如果有了xPath,我们定位我们的节点将变得很轻松。他可以根据路径,属性,甚至是条件进行节点的检索。
      XPath 使用路径表达式在XML 文档中进行导航
      XPath 包含一个标准函数库
      XPath 是 XSLT 中的主要元素
      XPath 是一个 W3C 标准

路径表达式语法:
      斜杠(/)作为路径内部的分割符。
      同一个节点有绝对路径和相对路径两种写法:
      路径(absolute path)必须用”/”起首,后面紧跟根节点,比如/step/step/…。
      相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step, 也就是不使用”/”起首。
      ”.”表示当前节点。
      ”..”表示当前节点的父节点
      nodename(节点名称):表示选择该节点的所有子节点
      ”/”:表示选择根节点
      ”//”:表示选择任意位置的某个节点
      ”@”: 表示选择某个属性

目录
打赏
0
0
0
0
8
分享
相关文章
实现一个带有昼夜背景切换的动态时钟:从代码到功能解析
本文介绍了一个使用Python和Tkinter库实现的动态时钟程序,具有昼夜背景切换、指针颜色随机变化及整点和半点报时功能。通过设置不同的背景颜色和随机变换指针颜色,增强视觉吸引力;利用多线程技术确保音频播放不影响主程序运行。该程序结合了Tkinter、Pygame、Pytz等库,提供了一个美观且实用的时间显示工具。欢迎点赞、关注、转发、收藏!
123 94
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
110 2
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
97 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
99 11
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
145 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
36 1
强化学习与深度强化学习:深入解析与代码实现
本书《强化学习与深度强化学习:深入解析与代码实现》系统地介绍了强化学习的基本概念、经典算法及其在深度学习框架下的应用。从强化学习的基础理论出发,逐步深入到Q学习、SARSA等经典算法,再到DQN、Actor-Critic等深度强化学习方法,结合Python代码示例,帮助读者理解并实践这些先进的算法。书中还探讨了强化学习在无人驾驶、游戏AI等领域的应用及面临的挑战,为读者提供了丰富的理论知识和实战经验。
82 5
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
55 3
|
15天前
|
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
72 17
|
26天前
|
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者

推荐镜像

更多