虽然Java中已经有了Dom和Sax这两种标准解析方式
但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心
为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具
鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作
往maven中添加的dom4j依赖如下:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6</version>
</dependency>
Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了
首先我们需要出创建一个xml文档,然后才能对其解析
xml文档:
<? xml version="1.0"
encoding="UTF-8"?> < books > < book id="001"> < title >Harry
Potter</ title > < author >J
K. Rowling</ author > </ book > < book id="002"> < title >Learning
XML</ title > < author >Erik
T. Ray</ author > </ book > </ books > |
示例一:用List列表的方式来解析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
|
import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Demo
{ public static void main(String[]
args) throws Exception
{ SAXReader
reader = new SAXReader(); File
file = new File( "books.xml" ); Document
document = reader.read(file); Element
root = document.getRootElement(); List<Element>
childElements = root.elements(); for (Element
child : childElements) { //未知属性名情况下 /*List<Attribute>
attributeList = child.attributes(); for
(Attribute attr : attributeList) { System.out.println(attr.getName()
+ ": " + attr.getValue()); }*/ //已知属性名情况下 System.out.println( "id:
" +
child.attributeValue( "id" )); //未知子元素名情况下 /*List<Element>
elementList = child.elements(); for
(Element ele : elementList) { System.out.println(ele.getName()
+ ": " + ele.getText()); } System.out.println();*/ //已知子元素名的情况下 System.out.println( "title" +
child.elementText( "title" )); System.out.println( "author" +
child.elementText( "author" )); //这行是为了格式化美观而存在 System.out.println(); } } } |
示例二:使用Iterator迭代器的方式来解析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
|
import java.io.File; import java.util.Iterator; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Demo
{ public static void main(String[]
args) throws Exception
{ SAXReader
reader = new SAXReader(); Document
document = reader.read( new File( "books.xml" )); Element
root = document.getRootElement(); Iterator
it = root.elementIterator(); while (it.hasNext())
{ Element
element = (Element) it.next(); //未知属性名称情况下 /*Iterator
attrIt = element.attributeIterator(); while
(attrIt.hasNext()) { Attribute
a = (Attribute) attrIt.next(); System.out.println(a.getValue()); }*/ //已知属性名称情况下 System.out.println( "id:
" +
element.attributeValue( "id" )); //未知元素名情况下 /*Iterator
eleIt = element.elementIterator(); while
(eleIt.hasNext()) { Element
e = (Element) eleIt.next(); System.out.println(e.getName()
+ ": " + e.getText()); } System.out.println();*/ //已知元素名情况下 System.out.println( "title:
" +
element.elementText( "title" )); System.out.println( "author:
" +
element.elementText( "author" )); System.out.println(); } } } |
运行结果:
示例三:创建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
|
import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class Demo
{ public static void main(String[]
args) throws Exception
{ Document
doc = DocumentHelper.createDocument(); //增加根节点 Element
books = doc.addElement( "books" ); //增加子元素 Element
book1 = books.addElement( "book" ); Element
title1 = book1.addElement( "title" ); Element
author1 = book1.addElement( "author" ); Element
book2 = books.addElement( "book" ); Element
title2 = book2.addElement( "title" ); Element
author2 = book2.addElement( "author" ); //为子节点添加属性 book1.addAttribute( "id" , "001" ); //为元素添加内容 title1.setText( "Harry
Potter" ); author1.setText( "J
K. Rowling" ); book2.addAttribute( "id" , "002" ); title2.setText( "Learning
XML" ); author2.setText( "Erik
T. Ray" ); //实例化输出格式对象 OutputFormat
format = OutputFormat.createPrettyPrint(); //设置输出编码 format.setEncoding( "UTF-8" ); //创建需要写入的File对象 File
file = new File( "D:" +
File.separator + "books.xml" ); //生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式 XMLWriter
writer = new XMLWriter( new FileOutputStream(file),
format); //开始写入,write方法中包含上面创建的Document对象 writer.write(doc); } } |
运行结果: