• XML 解析技术:DOM4j


    前言:
    我一直以来就坚信一句话:不积跬步无以至千里,不积小流无以成江海。可能很多人对一些基础概念会选择性忽略,但往往基础和知识理解深度决定你的上限。

    今天给大家带来一个对框架以及容器源码理解提升的知识点笔记:XML 解析技术,这个知识点也是大家容易忽视的知识点。

    大家学完后也可以想想Tomcat是怎么解析web.xml文件的?spring框架是怎么解析 bean.xml文件的?…

    1 文档

    https://dom4j.github.io/javadoc/1.6.1/

    2 XML 解析技术原理

    1. 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析
    2. document 对象表示的是整个文档(可以是 html 文档,也可以是 xml)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuhxuL2V-1663389775569)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220406102815529.png)]

    3 XML解析技术

    ● 早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介

    1. dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java 对 dom 技术解析也做了实现

    2. sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML ) SAX 解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。 是一行一行的读 取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在性能上优于 Dom 解析

    3. 这两种技术已经过时,知道有这两种技术即可

    ● 第三方的 XML 解析技术

    1. jdom 在 dom 基础上进行了封装
    2. dom4j 又对 jdom 进行了封装。
    3. pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件

    4 DOM4J 介绍

    1. Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。

    2. 与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。

    3. Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j。

    4. 使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件

    5 DOM4j 中,获得 Document 对象的方式有三种

    ● 开发 dom4j 要导入 dom4j 的包

    1、读取 XML 文件,获得 document 对象

    SAXReader reader = new SAXReader(); //创建一个解析器 
    Document document = reader.read(new File("src/input.xml"));//XML Document
    
    • 1
    • 2

    2、解析 XML 形式的文本,得到 document 对象

    String text = "";
    Document document = DocumentHelper.parseText(text);
    
    • 1
    • 2

    3、主动创建 document 对象

    Document document = DocumentHelper.createDocument(); //创建根节点 
    Element root = document.addElement("members");
    
    • 1
    • 2

    6 DOM4j应用案例

    1. 使用 DOM4J 对 students.xml 文件进行增删改查
    • 重点讲解查询(遍历和指定查询)
    • xml增删改使用少,作为扩展,给出案例
    1. 引入 dom4j 的依赖的 jar 包,也可以使用maven配置

    在这里插入图片描述

    1. 创建students.xml
    
    <students>
        <student id="01">
            <name>小龙女name>
            <gender>gender>
            <age>16age>
            <resume>古墓派掌门人resume>
        student>
        <student id="02">
            <name>欧阳锋name>
            <gender>gender>
            <age>18age>
            <resume>白驼山,蛤蟆神功resume>
        student>
    students>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    1. 演示 Dom4j 对 xml 文件的增删改查/遍历

    第一步:演示如何加载xml文件

    public class Dom4j_ {
        /**
         * 演示如何家长在xml解析器
         */
        @Test
        public void loadXML() throws DocumentException {
            //得到一个解析器
            SAXReader reader = new SAXReader();
            
            Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
            System.out.println(document);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    org.dom4j.tree.DefaultDocument@65ae6ba4 [Document: name file:///f:/Java/JavaWeb/XML/src/DOM4J/student.xml]
    
    • 1

    debug 看看document对象的属性,分析了document对象的底层结构
    在这里插入图片描述
    在这里插入图片描述

    想一想content为什么是5?

    答:因为在里面将换行符\n也当做一个,有两个内容,三个换行符。

    我们可以再往下看看标签里面

    在这里插入图片描述
    在这里插入图片描述

    第二步:遍历students里面的元素

    先获取里面的元素

    @Test
    public void listStus() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
    
        //1. 得到rootElement
        Element rootElement = document.getRootElement();
        System.out.println(rootElement);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行结果:

    org.dom4j.tree.DefaultElement@6a6824be [Element: ]
    
    • 1

    再获取里面的元素

    @Test
    public void listStus() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
    
        //1. 得到rootElement
        Element rootElement = document.getRootElement();
        System.out.println(rootElement);
        //2. 得到rootElement的student Elements
        List<Element> students = rootElement.elements("student");
        System.out.println(student.size());//2
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:

    2
    
    • 1

    去遍历student里面的元素

    @Test
    public void listStus() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
    
        //1. 得到rootElement
        Element rootElement = document.getRootElement();
        //2. 得到rootElement的student Elements
        List<Element> students = rootElement.elements("student");
        //System.out.println(student.size());//2
        for (Element student : students) {//element就是Student元素/节点
            //获取Student元素 的name Element
            Element name = student.element("name");
            Element age = student.element("age");
            Element resume = student.element("resume");
            Element gender = student.element("gender");
    
            System.out.println("学生信息= " + name.getText() + " " + age.getText() +
                    " " + resume.getText() + " " + gender.getText());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:

    学生信息= 小龙女 16 古墓派掌门人 女
    学生信息= 欧阳锋 18 白驼山,蛤蟆神功 男
    
    • 1
    • 2

    第三步:指定读取第一个学生的信息 就是 dom4j+xpath

    /**
     * 指定读取第一个学生的信息 就是 dom4j+xpath
     */
    @Test
    public void readOne() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/DOM4J/student.xml"));
    
        //1. 得到rootElement, 你是OOP
        Element rootElement = document.getRootElement();
    
        //2. 获取第一个学生
        Element student = (Element) rootElement.elements("student").get(1);
        //3. 输出该信息
        System.out.println("该学生的信息= " + student.element("name").getText() + " " +
                student.element("age").getText() + " " + student.element("resume").getText() +
                student.element("gender").getText());
    
        //4. 获取student元素的属性
        System.out.println("id= " + student.attributeValue("id"));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:

    该学生的信息= 欧阳锋 18 白驼山,蛤蟆神功男
    id= 02
    
    • 1
    • 2

    第四步:加元素(要求: 添加一个学生到xml中)

    /**
     * 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
     * @throws Exception
     */
    @Test
    public void add() throws Exception {
    
        //1.得到解析器
        SAXReader saxReader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = saxReader.read(new File("src/DOM4J/student.xml"));
    
    
        //首先我们来创建一个学生节点对象
        Element newStu = DocumentHelper.createElement("student");
        Element newStu_name = DocumentHelper.createElement("name");
        //如何给元素添加属性
        newStu.addAttribute("id", "04");
        newStu_name.setText("宋江");
        //创建age元素
        Element newStu_age = DocumentHelper.createElement("age");
        newStu_age.setText("23");
        //创建resume元素
        Element newStu_intro = DocumentHelper.createElement("resume");
        newStu_intro.setText("梁山老大");
    
        //把三个子元素(节点)加到 newStu下
        newStu.add(newStu_name);
        newStu.add(newStu_age);
        newStu.add(newStu_intro);
        //再把newStu节点加到根元素
        document.getRootElement().add(newStu);
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码utf-8
    
        //把我们的xml文件更新
        // lets write to a file
        //new FileOutputStream(new File("src/myClass.xml"))
        //使用到io编程 FileOutputStream 就是文件字节输出流
        XMLWriter writer = new XMLWriter(
                new FileOutputStream("src/DOM4J/student.xml"), output);
        writer.write(document);
        writer.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    运行结果:

    
    <students> 
      <student id="01"> 
        <name>小龙女name>  
        <gender>gender>  
        <age>16age>  
        <resume>古墓派掌门人resume> 
      student>  
      <student id="02"> 
        <name>欧阳锋name>  
        <gender>gender>  
        <age>18age>  
        <resume>白驼山,蛤蟆神功resume> 
      student>  
      <student id="04">
        <name>宋江name>
        <age>23age>
        <resume>梁山老大resume>
      student>
    students>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

  • 相关阅读:
    穿越火线几次体验良好的游戏优化方案
    (ECCV-2022)GaitEdge:超越普通的端到端步态识别,提高实用性(续)
    Pytorch总结十四之优化算法:梯度下降法、动量法
    PaddlePaddle框架安装
    HCIA-STP原理与配置
    JS Map与weakMap
    EPSS 解读:与 CVSS 相比,孰美?
    1.5 HDFS分布式文件系统-hadoop-最全最完整的保姆级的java大数据学习资料
    Nginx修改默认Content-Type值
    leetcode数据结构与算法刷题(三)
  • 原文地址:https://blog.csdn.net/Baridhu/article/details/126903946