一、简介
在上篇文章中,我们介绍了 JDOM 解析技术!
经过整理,通过 Java 程序解析 XML 文件,目前比较主流的有以下四种方式:
- DOM 解析
- SAX 解析
- JDOM 解析
- DOM4J 解析
本篇介绍第四种解析技术:DOM4J 解析!
二、DOM4J 解析
DOM4J 也是 Java 生态中一款非常非常优秀的 XML 开源文档解析库,是 JDOM 的升级品。
最初,它是 JDOM 的一种分支,后来合并了许多超出基本 XML 文档表示的功能,最后单独作为一工具对外发布。
优点如下:
- 1.性能优异,功能强大,极端易使用
- 2.开发简便,同时也提供了一些提高性能的代替方法
- 3.支持 XPath
唯一的缺点:
- API 过于复杂
下面我们以如下的 XML 文件为例,介绍解析的实现过程。
<?xml version="1.0" encoding="utf-8" ?>
<class>
<student id="1">
<name>张三</name>
<gender>男</gender>
<age>26</age>
</student>
<student id="2">
<name>里斯</name>
<gender>男</gender>
<age>36</age>
</student>
<student id="3">
<name>王五</name>
<gender>女</gender>
<age>24</age>
</student>
</class>
DOM4J 实现过程如下:
<!-- dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
public class Dom4jDemo {
public static void main(String[] args) throws Exception {
// 1.获取xml文件流
InputStream inputStream = Dom4jDemo.class.getClassLoader().getResourceAsStream("demo.xml");
// 2.创建Reader对象
SAXReader reader = new SAXReader();
// 3.加载xml
Document document = reader.read(inputStream);
// 4.获取根节点
Element rootElement = document.getRootElement();
// 5.遍历元素
Iterator iterator = rootElement.elementIterator();
while (iterator.hasNext()){
Element stu = (Element) iterator.next();
// 遍历标签属性
List<Attribute> attributes = stu.attributes();
for (Attribute attribute : attributes) {
System.out.println(attribute.getName() + ":" + attribute.getValue());
}
// 遍历标签子节点
Iterator iterator1 = stu.elementIterator();
while (iterator1.hasNext()){
Element stuChild = (Element) iterator1.next();
System.out.println(stuChild.getName()+":"+stuChild.getStringValue());
}
System.out.println("==============");
}
}
}
运行结果如下:
id:1
name:张三
gender:男
age:26
==============
id:2
name:里斯
gender:男
age:36
==============
id:3
name:王五
gender:女
age:24
==============
三、小结
最后总结一下,目前许多开源项目中大量采用 DOM4J,例如 Hibernate 框架中就用到 DOM4J 来读取 XML 配置文件,连 Sun 的 JAXM 也在用 DOM4J。
因此对于需要使用 XML 解析工具,如果项目中没有什么包袱,首选 DOM4J。
对于一些已经在项目中用到的 XML 解析工具,如果不考虑移植性问题,也可以改成 DOM4J 来实现,当然具体问题具体分析,如果迁移成本很高,以前的工具依然能正常运行,也没必要进行迁移。总之就是,适合的才是最好的,是否值得迁移,需要评估资源成本和时间以及必要性。