文章目录
- [XML & DOM4j](#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();
}