XML & DOM4j

文章目录

XML & DOM4j

XML(可扩展标记语言)是一种标记语言,用于描述数据的结构和内容。XML被设计用来传输和存储数据,同时也可以作为配置文件或用于表示文档结构。

文档:https://www.w3school.com.cn/xml/index.asp

1. XML 语法

示例:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student>
        <id>1</id>
        <name>Alice</name>
        <age>20</age>
    </student>
    <student>
        <id>2</id>
        <name>Bob</name>
        <age>22</age>
    </student>
</students>

一个 XML 文件分为如下几部分内容

  • 文档声明
  • 元素
  • 属性
  • 注释
  • CDATA 区 、特殊字符

文档声明

XML 声明放在 XML 文档的第一行,例如:<?xml version="1.0" encoding="UTF-8"?>

XML 声明由以下几个部分组成:

  • version - -文档符合 XML1.0 规范
  • encoding - -文档字符编码,比如"utf-8"

元素

XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签。

注意点:

1)每个XML文档必须有且只有一个根元素。

2)根元素是一个完全包括文档中其他所有元素的元素。

3)根元素的起始标记要放在所有其他元素的起始标记之前。

4)根元素的结束标记要放在所有其他元素的结束标记之后。

5)XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式:

  • 包含标签体:<a>www.sohu.cn</a>
  • 不含标签体的:<a></a>, 简写为:<a/>

6)一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套。

XML 元素命名规则:

  • 区分大小写,例如,<P>和<p>是两个不同的标记。
  • 不能以数字开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)。
  • 如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>

属性

xml 复制代码
<Student ID="100">
    <Name>TOM</Name>
</Student>

其中ID就为Student的属性。

注意点:

1)属性值用双引号(")或单引号(')分隔。(如果属性值中有',用"分隔;有",用'分隔)

2) 一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">

3)特定的属性名称在同一个元素标记中只能出现一次。

4)属性值不能包括 & 字符

注释

xml 复制代码
<!--这是一个注释- ->

CDATA 节

有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记。

语法:

xml 复制代码
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>

转义字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。

2. DOM4j

Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。

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

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

快速入门

java 复制代码
// 得到解析器
SAXReader saxReader = new SAXReader();
// 获取document对象
Document document = saxReader.read("src/student.xml");
// 获取根元素
Element rootElement = document.getRootElement();
// 获取所有student元素
List<Element> student = rootElement.elements("student");
for (Element element : student) {
    // 获取name
    Element name = element.element("name");
    // 获取age
    Element age = element.element("age");
    // 获取id属性
    Attribute id = element.attribute("id");
    System.out.println(id.getText() + " " + name.getText() + ":" + age.getText());
}

增删改操作

java 复制代码
try {
    // 读取XML文件
    File file = new File("students.xml");
    SAXReader reader = new SAXReader();
    Document document = reader.read(file);

    // 添加新的学生信息
    Element root = document.getRootElement();
    Element newStudent = root.addElement("student");
    newStudent.addElement("id").setText("4");
    newStudent.addElement("name").setText("David");
    newStudent.addElement("age").setText("23");
    newStudent.addElement("gender").setText("M");

    // 删除指定ID的学生信息
    String idToDelete = "2";
    for (Element student : root.elements("student")) {
        if (student.elementText("id").equals(idToDelete)) {
            root.remove(student);
            break;
        }
    }

    // 修改指定ID的学生信息的年龄
    String idToUpdate = "3";
    Element root = document.getRootElement();
    for (Element student : root.elements("student")) {
        if (student.elementText("id").equals(idToUpdate)) {
            Element ageElement = student.element("age");
            ageElement.setText("25");
            break;
        }
    }

    // 写入更新后的XML文件
    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter writer = new XMLWriter(new FileWriter("students_updated.xml"), format);
    writer.write(document);
    writer.close();

} catch (Exception e) {
    e.printStackTrace();
}
相关推荐
ok!ko2 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589362 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰3 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没3 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥4 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程5 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇5 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码5 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈6 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃6 小时前
SpringBoot的数据访问
java·spring boot·后端