Dom4j解析
前言
XML是可扩展标记语言的缩写,在编程领域是非常常用的,我们经常会用它进行数据的传输或者用作配置文件,那么对XML的操作的也会是我们需要掌握的一项技术,本文会使用Java语言,利用DOM4J这个非常优秀的开源库,探讨生成XML格式数据和解析XML数据的两个方面的问题。
1. Dom4J简介
- 在Dom4j.org上,是这么介绍的:Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
- 简单来说,Dom4j具有性能优秀,操作简单的优点
2. Dom4j的使用
- 2.1 导入jar包
- 这个操作非常简单,我们可以在网上下载jar包,或者在https://sourceforge.net/projects/dom4j/?source=directory下载了dom4j项目之后,解压缩成jar包,然后导入项目中
- 这个操作非常简单,我们可以在网上下载jar包,或者在https://sourceforge.net/projects/dom4j/?source=directory下载了dom4j项目之后,解压缩成jar包,然后导入项目中
- 2.2 案例一:用Java代码生成xml文档
- 代码思路:我们要生成一个XML文档,其实就像我们平时书写文档是一样的道理:
- 创建文档 -> 创建根元素 -> 添加根元素
- 子元素也是先创建再添加到其他元素中
- 如果元素上有属性则先添加属性
- 下面直接上代码
- [Java] 纯文本查看 复制代码
?01
02
03
04
05
06
07
08
09
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
54import java.io.FileOutputStream;
import java.io.FileWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4JTest1 {
public static void main(String[] args) throws Exception {
// 第一种方式:创建文档,并创建根元素
// 创建文档:使用了一个Helper类
Document document = DocumentHelper.createDocument();
// 创建根节点并添加进文档
Element root = DocumentHelper.createElement("student");
document.setRootElement(root);
// 第二种方式:创建文档并设置文档的根元素节点
Element root2 = DocumentHelper.createElement("student");
Document document2 = DocumentHelper.createDocument(root2);
// 添加属性
root2.addAttribute("name", "zhangsan");
// 添加子节点:add之后就返回这个元素
Element helloElement = root2.addElement("hello");
Element worldElement = root2.addElement("world");
helloElement.setText("hello Text");
worldElement.setText("world text");
// 输出
// 输出到控制台
XMLWriter xmlWriter = new XMLWriter();
xmlWriter.write(document);
// 输出到文件
// 格式
OutputFormat format = new OutputFormat(" ", true);// 设置缩进为4个空格,并且另起一行为true
XMLWriter xmlWriter2 = new XMLWriter(
new FileOutputStream("student.xml"), format);
xmlWriter2.write(document2);
// 另一种输出方式,记得要调用flush()方法,否则输出的文件中显示空白
XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("student2.xml"),
format);
xmlWriter3.write(document2);
xmlWriter3.flush();
// close()方法也可以
}
} - 程序Console输出:
- [XML] 纯文本查看 复制代码
?01
02
03
04
05
06
07
08
09
10<?xml version="1.0" encoding="UTF-8"?>
<student/>
生成的一个xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<student name="zhangsan">
<hello>hello Text</hello>
<world>world text</world>
</student> - 小总结到目前为止我们已经完成了对一个xml格式数据的生成,如果要生成其他样式的数据,也是比较类似的操作,本文就不再赘述了。
- 代码思路:我们要生成一个XML文档,其实就像我们平时书写文档是一样的道理:
- 2.3 案例二:读入xml文档并分析,将其内容输出
- 了解了实现思想后,我们就直接改写顺序查找算法,用二分查找思想来实现查找
首先,待分析的文档如下:
- [XML] 纯文本查看 复制代码
?1
2
3
4
5
6
7
8
9<?xml version="1.0" encoding="UTF-8"?>
<students name="zhangsan">
<hello name="lisi">hello Text1</hello>
<hello name="lisi2">hello Text2</hello>
<hello name="lisi3">hello Text3</hello>
<world name="wangwu">world text1</world>
<world name="wangwu2">world text2</world>
<world >world text3</world>
</students>
- 代码思路:由外而内的取获取节点读取数据
- 获取整个文档
- 获取根元素students
- 遍历根元素students获取每个子元素
- 然后通过元素拿到对应的名称、属性值等数据
以下是代码实现
[Java] 纯文本查看 复制代码
?
01
02 03 04 05 06 07 08 09 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 |
import java.io.File;
import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.DOMReader; import org.dom4j.io.SAXReader; public class Dom4JTest2 { public static void main(String[] args) throws Exception { SAXReader saxReader = new SAXReader(); // 获取文档对象 Document document = saxReader.read(new File("students.xml")); // 获取根元素 Element root = document.getRootElement(); System.out.println("Root: " + root.getName()); // 获取所有子元素 List<Element> childList = root.elements(); System.out.println("total child count: " + childList.size()); // 获取特定名称的子元素 List<Element> childList2 = root.elements("hello"); System.out.println("hello child: " + childList2.size()); // 获取名字为指定名称的第一个子元素 Element firstWorldElement = root.element("world"); // 输出其属性 System.out.println("first World Attr: " + firstWorldElement.attribute(0).getName() + "=" + firstWorldElement.attributeValue("name")); System.out.println("迭代输出-----------------------"); // 迭代输出 for (Iterator iter = root.elementIterator(); iter.hasNext();) { Element e = (Element) iter.next(); System.out.println(e.attributeValue("name")); } System.out.println("用DOMReader-----------------------"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); // 注意要用完整类名 org.w3c.dom.Document document2 = db.parse(new File("students.xml ")); DOMReader domReader = new DOMReader(); // 将JAXP的Document转换为dom4j的Document Document document3 = domReader.read(document2); Element rootElement = document3.getRootElement(); System.out.println("Root: " + rootElement.getName()); } } |
控制台输出:
Root: studentstotal child count: 6hello child: 3first World Attr: name=wangwu迭代输出-----------------------lisilisi2lisi3wangwuwangwu2null用DOMReader-----------------------Root: students
3. 总结到目前为止我们已经用Dom4j完成了生成XML文档以及解析XML文档的操作,相信大家已经对Dom4j有了一定的了解,更复杂的XML只是操作起来步骤更多而已,其思路都是类似的。祝大家学有所成