Java 操作xml文件的dom4J库使用

XML简介

什么是xml?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

xml文件实例

下面是自定义的xml文件

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8" ?>
<Users>
<User name="Johnson" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="leo" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="John" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="Mary" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="Paul" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
</Users>

  • 其中的Users, User元素标签是自定义的,在这里表示用户列表、用户对象
  • User元素中的name, password, phoneNum, email代表定义该对象的属性

dom4j

dom4j简介

dom4j是一个用来读写XML文件的Java XML API。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,是一个开放源代码的软件。

dom4j使用方式

引入项目依赖,这里以maven项目为例

1
2
3
4
5
6
7
   <dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>

准备好自定义的xml文件,这里以上面的xml文件为例,将其保存为users.xml

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8" ?>
<Users>
<User name="Johnson" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="leo" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="John" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="Mary" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
<User name="Paul" password="admin" phoneNum="10036363636" email="123456789@qq.com"/>
</Users>

编写程序,读取xml文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static void main(String... strings) throws Exception {
//文件路径
String filePathName = "C:\\Users\\johnson\\Desktop\\users.xml";

//定义dom4j的SAXReader对象
SAXReader reader = new SAXReader();

//通过reader获取到的文件内容被读取并转换成Document对象
Document document = reader.read(new File(filePathName));

//获取文档中的根节点, Element是dom4j的元素对象,即获取Users标签的元素
Element rootElement = document.getRootElement();

//获取根节点中的所有子元素列表,即user对象列表
@SuppressWarnings("unchecked")
List<Element> userElements = rootElement.elements();

//element对象的attributeValue(String name)方法可以获取到元素的属性值
userElements.forEach(userElement -> System.out.println(userElement.attributeValue("name") +
" || " + userElement.attributeValue("password") +
" || " + userElement.attributeValue("phoneNum") +
" || " + userElement.attributeValue("email")));
}

由于xml文件元素是自定义的,因此需要自定义的程序来解析,程序运行解析结果如下:

1
2
3
4
5
Johnson || admin || 10036363636 || 123456789@qq.com
leo || admin || 10036363636 || 123456789@qq.com
John || admin || 10036363636 || 123456789@qq.com
Mary || admin || 10036363636 || 123456789@qq.com
Paul || admin || 10036363636 || 123456789@qq.com

dom4j xml文件读取写入操作封装实例

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package xxx.xxx.xxx.xxx.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* 对XML文件进行操作的工具类
*
* Created by Xuyh at 2017年4月21日 下午7:41:42.
*/
public class XMLUtils {
private static Logger logger = LoggerFactory.getLogger(XMLUtils.class);

/**
* 将document写入XML文件
*
* @param filePathName 文件路径名
* @param document
* @return
*/
public static boolean wirteXMLFile(String filePathName, Document document) {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = null;
try {
writer = new XMLWriter(new FileOutputStream(new File(filePathName)), format);
writer.write(document);
writer.flush();
} catch (UnsupportedEncodingException e1) {
logger.warn(e1.getMessage());
return false;
} catch (IOException e2) {
logger.warn(e2.getMessage());
return false;
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
logger.warn(e.getMessage());
return false;
}
}
}
return true;
}

/**
* 读取XML文件获取document
*
* @param filePathName 文件路径名
* @return
*/
public static Document readXMLFile(String filePathName) {
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(new File(filePathName));
} catch (DocumentException e) {
logger.warn(e.getMessage());
}
return document;
}

/**
* 读取XML文件获取document
*
* @param file 文件对象
* @return
*/
public static Document readXMLFile(File file) {
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(file);
} catch (DocumentException e) {
logger.warn(e.getMessage());
}
return document;
}
}

需要注意的是,该工具类使用到了slf4j库来记录日志

1
2
3
4
5
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>