DOM4j及源码分析

DOM4j

文档: dom4j.github.io/javadoc/1.6...

本地文档: dom4j-1.6.1\docs\index.html

XML 解析技术原理

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

XML 解析技术介绍

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

  1. dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析也做了实现
  2. sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API forXML)SAX解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。 是一行一行的读取 xml 文件进行解析的不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在性能上优于 Dom 解析
  3. 这两种技术已经过时,知道有这两种技术即可

● 第三方的 XML 解析技术

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

DOM4J 介绍

  1. Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发JDOM 的人分离出来而后独立开发的。
  2. 与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。
  3. Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j。

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

● 开发 dom4j 要导入 dom4j 的包 1、读取 XML 文件,获得 document 对象 SAXReader reader = new SAXReader(); //创建一个解析器 Document document = reader.read(new File("src/input.xml"));//XML Document

2、解析 XML 形式的文本,得到 document 对象 String text = ""; Document document = DocumentHelper.parseText(text);

3.主动创建 document 对象. Document document = DocumentHelper.createDocument(); //创建根节点 Element root = document.addElement("members");

DOM4j 应用实列

源码

增删改查代码

java 复制代码
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.jupiter.api.Test;

import java.io.File;

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

public class Dom4j_ {

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

java 复制代码
   @Test
   public void readOne() throws DocumentException {
       //得到一个解析器
       SAXReader reader = new SAXReader();
       //代码技巧->debug 看看 document 对象的属性
       //分析了 document 对象的底层结构
       Document document = reader.read(new File("src/students.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"));
   }
scss 复制代码
 加元素(要求: 添加一个学生到 xml 中) [不要求,使用少,了解]
java 复制代码
   @Test
   public void add() throws Exception {
       //1.得到解析器
       SAXReader saxReader = new SAXReader();
       //2.指定解析哪个 xml 文件
       Document document = saxReader.read(new File("src/students.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(new File("src/students.xml")), output);
       writer.write(document);
       writer.close();
   }
   
  • //删除元素(要求:删除第一个学生) 使用少,了解
java 复制代码
   @Test

   public void del() throws Exception {
       //1.得到解析器
       SAXReader saxReader = new SAXReader();
       //2.指定解析哪个 xml 文件
       Document document = saxReader.read(new File("src/students.xml"));
       //找到该元素第一个学生
       Element stu = (Element)
               document.getRootElement().elements("student").get(2);
       //删除元素
       stu.getParent().remove(stu);
       // //删除元素的某个属性
       // stu.remove(stu.attribute("id"));
       //更新 xml
       //直接输出会出现中文乱码:
       OutputFormat output = OutputFormat.createPrettyPrint();
       韩顺平 Java 工程师
       output.setEncoding("utf-8");//输出的编码 utf-8
       //把我们的 xml 文件更新
       XMLWriter writer = new XMLWriter(
               new FileOutputStream(new File("src/students.xml")), output);
       writer.write(document);
       writer.close();
       System.out.println("删除成功~");
   }

更新元素(要求把所有学生的年龄+3) 使用少,了解

java 复制代码
    @Test
    public void update() throws Exception {
        //1.得到解析器
        SAXReader saxReader = new SAXReader();
        //2.指定解析哪个 xml 文件
        Document document = saxReader.read(new File("src/students.xml"));
     
        //得到所有学生的年龄
        List<Element> students = document.getRootElement().elements("student");
        //遍历, 所有的学生元素的 age+3
        for (Element student : students) {
            //取出年龄
            Element age = student.element("age");
            age.setText((Integer.parseInt(age.getText()) + 3) + "");
        }
        //更新
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码 utf-8
        //把我们的 xml 文件更新
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
        System.out.println("更新成功~");
    }
}
相关推荐
码熔burning4 分钟前
JVM 面试精选 20 题(续)
jvm·面试·职场和发展
Victor3569 分钟前
Redis(14)Redis的列表(List)类型有哪些常用命令?
后端
Victor35610 分钟前
Redis(15)Redis的集合(Set)类型有哪些常用命令?
后端
卷福同学11 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
海绵不是宝宝8178 小时前
连接远程服务器上的 jupyter notebook,解放本地电脑
服务器·jupyter·github
bobz9659 小时前
小语言模型是真正的未来
后端
DevYK9 小时前
企业级 Agent 开发实战(一) LangGraph 快速入门
后端·llm·agent
艾伦~耶格尔10 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
一只叫煤球的猫10 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
冒泡的肥皂10 小时前
MVCC初学demo(一
数据库·后端·mysql