DOM4j及源码分析

news2024/11/26 10:25:42

文章目录

  • DOM4j
    • XML 解析技术原理
      • XML 解析技术介绍
    • DOM4J 介绍
      • DOM4j 中,获得 Document 对象的方式有三种
      • 源码
      • 增删改查代码

DOM4j

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

本地文档: 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 应用实列

源码

在这里插入图片描述

增删改查代码

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

   @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"));
   }
 加元素(要求: 添加一个学生到 xml 中) [不要求,使用少,了解]
   @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();
   }
   
  • //删除元素(要求:删除第一个学生) 使用少,了解
   @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) 使用少,了解

    @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("更新成功~");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OAuth2.0详细介绍与实践(通俗易懂)

一、OAuth2.0介绍 1.1 概述 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息&#xff08;如用户名与密码&#xff09;&#xff0c;即第三方无需使用用户的用户名与密码就可以申请获…

[Juc进阶]Callable、Future和FutureTask

一、Callable 与 Runnable 先说一下java.lang.Runnable吧&#xff0c;它是一个接口&#xff0c;在它里面只声明了一个run()方法&#xff1a; public interface Runnable {public abstract void run(); }由于run()方法返回值为void类型&#xff0c;所以在执行完任务之后无法返…

多个文件保存位置不同:如何一键批量重命名为相同名称

在日常工作中&#xff0c;我们会经常遇到需要修改文件名称&#xff0c;文件改名方法也是很多种呢&#xff0c;可以手动修改或使用工具批量重命名&#xff0c;一般大家修改文件或文件夹重命名&#xff0c;都是在同一个保存位置&#xff0c;有没有遇到多个文件保存位置不同&#…

抖音账号矩阵系统源码.搭建技术开发分享

技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 部分源码分享&#xff1a; //计算分页$active_list_all $Video_model->getCount($where);$page_libs new Libs_Pagin…

Android平台如何高效率实现GB28181对接?

技术背景 GB28181协议是一种用于设备状态信息报送的协议&#xff0c;可以在不同设备之间进行通信和数据传输。 在安卓系统上实现GB/T 28181非常必要&#xff0c;GB28181协议实现分两部分&#xff0c;一部分是信令&#xff0c;另外一部分就是媒体数据的编码。 信令主要包括S…

CenterNet Objects as Points 论文学习

论文链接&#xff1a;Objects as Points 1. 解决了什么问题&#xff1f; 目标检测的任务是从图像中检出目标的矩形框。现有的检测方法大多会穷举所有潜在的目标位置&#xff0c;然后做分类。这非常浪费资源、低效率&#xff0c;并且依赖后处理。单阶段方法会在图像上放置大量…

049、事务设计之分布式基本原理

隔离级别 iso定义的隔离级别 可串行化 可重复读 读已提交 读未提交 隔离级别区分的现象 脏读&#xff1a; 一个事务读取另一个未提交的事务所做更改 不可重复度 &#xff1a;同一事务中&#xff0c;前后执行相同的语句&#xff0c;出来的记录不一样 幻读&#xff1a; 同一事务…

ImVoxelNet 论文学习

论文链接&#xff1a;ImVoxelNet: Image to Voxels Projection for Monocular and Multi-View General-Purpose 3D Object Detection 1. 解决了什么问题&#xff1f; RGB 图像成本低、数据源丰富&#xff0c;可以提供场景和物体的视觉信息&#xff0c;但不包括场景几何结构的…

guitar pro2023最新专业的吉他制谱、扒谱软件

guitar pro8是一款打谱编曲软件。我们是会在guitar pro8里面去得到更多自由的打谱设置操作。软件中的改变都很强大好用&#xff0c;是会等等更轻松的编曲制作和设置等等。这里面的所有使用都是很精彩的&#xff0c;是能够去随意的使用更多不同的音符节拍的设置。想要自己进行打…

全志F1C200S嵌入式驱动开发(spi-nand驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s也支持tf卡、spi-nor、spi-nand启动。前面也说过,tf卡由于机械结构的原因,更适合拿来学习,spi-nor和spi-nand比较适合用来进行工业部署和消费娱乐领域。只是s…

使用3DS Max 创建未来派螺栓枪模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 步骤 1 创建一个框并将其转换为可编辑多边形&#xff08;右键单击>转换为&#xff1a;>转换为可编辑多边形&#xff09;&#xff0c;然后使用连接添加一系列边循环&#xff0c;如下图所示。 步骤 2 …

vue往window里存数据

1、存 window._getAction () > {return actions}2、取 const parentAction window._getAction()

使用openvpn docker及frp docker工具构建虚拟专业网络(V-P-N)

使用openvpn docker及frp docker工具构建虚拟专业网络(V-P-N) 借助Docker和OpenVPN技术&#xff0c;您可以在短时间内设置并运行VPN服务器&#xff0c;并保证您的服务器安全。 运行环境 Ubuntu 16.04 TLS Docker version 19.03.8, build afacb8b7f0 OpenVPN Android Client …

Mysql教程(三):Mysql图形化工具DataGrip的基本使用

Mysql教程&#xff08;三&#xff09;&#xff1a;Mysql图形化工具DataGrip的基本使用 引言&#xff1a;为什么选择DataGrip 智能查询控制台 可以让您在不同的模式中执行查询&#xff0c;并提供本地历史记录&#xff0c;从而记录您的所有活动&#xff0c;避免工作丢失。高效的…

matplotlib 3D

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np# 创建一个三维坐标轴 fig plt.figure() ax fig.add_subplot(221, projection3d) xx fig.add_subplot(222) yy fig.add_subplot(223) xy fig.add_subplot(224)# 生成示例数据…

(vite/webpack 通用)vue 白屏 Uncaught Syntaxerror: Unexpected token ‘?‘

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 一、问题的描述 突然收到业务方发来的反馈&#xff1a; 浏览器一片空白&#xff0c;开控制台输出&#xff1a;Uncaught Syntaxerror: Unexpected token ? 这个是语法错误。 二、 如果是用vite来构建&#xff1a…

react项目打包部署到服务器上+宝塔面板的操作

首先进行配置react项目&#xff0c;在webpack.json中 加上homepage:.或‘./’ 首先需要项目打包 npm run build 我们会得到一个build 运行build中的index文件如果是空白的话我们需要更改上面的操作重新打包 .或./ 打包完我们需要进入腾讯云或阿里云的安全组中进行配置端口 …

数字图像学笔记 —— 19.肤色检测

文章目录 什么是肤色检测需要使用OpenCV函数颜色空间转换颜色范围位运算 什么是肤色检测 在没有AI之前&#xff0c;肤色检测是计算机视觉的一项常见任务。其根本思路是划定一个颜色区域&#xff0c;只要属于该颜色区域的像素就认为属于肤色。但是这种方法的精确度不高&#xf…

nodejs调取exe执行文件连接websocket

最近有个需求&#xff0c;就是需要前端调取一个封装成exe文件的websoket服务。 很显然&#xff0c;在浏览器的框架下&#xff0c;根本不可能完成这个事情。以为浏览器的沙盒机制和安全策略&#xff0c;是不允许读取本地文件的。 所以&#xff0c;我们需要nodejs的帮助。 那么…

企业应如何做好软件供应链安全管理?

随着软件供应链攻击日益普遍&#xff0c;Gartner 将其列为2022 年的第二大威胁。Gartner 预测&#xff0c;到 2025 年&#xff0c;全球 45% 的组织将遭受一次或多次软件供应链攻击&#xff0c;是2021年的3倍。这些攻击一旦成功&#xff0c;将给企业带来毁灭性打击&#xff0c;因…