首先了解一下XML,XML是可擴展標記語言,看起來像下面這個樣子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?xml
version="1.0"?> 2
<小紙條> 3
<收件人>大元</收件人> 4
<發件人>小張</發件人> 5
<主題>問候</主題> 6
<具體內容>早啊,飯吃了沒? </具體內容> 7
</小紙條>``` 第一行爲頭部,展示了版本號和編碼,爲utf-8. xml中標籤是自己定義的,兩個標籤中的數據爲數值。 在java中解析xml學習的是使用sax 使用sax解析可以分爲5種事件,如下 i)
開始文檔事件 startDocument() ii)
開始標籤事件 start Element() iii)
文本事件 charachaers() iv)
結束標籤事件 endElement() v)
結束文檔事件endDocument() 大概流程就是在對應的解析函數中,自己操作數據,將數據取得,然後賦給實體類。下面一步一步的來完成這個過程。 首先第一步 創建一個sax解析工廠,這個工廠使用newInstance方法來得到,而不是創建出來的。 ```java SAXParserFactory
factory = SAXParserFactory.newInstance(); |
第二步通過解析器的工廠來創建一個解析器
1
|
SAXParser
parser = factory.newSAXParser(); |
然後我們可以通過解析器來解析xml文檔,通過parser(String,handler)其中的String就是文件路徑,不過也可以通過其他的方式,比如流等,文件都可以傳入,問題在於後面的handler,這裏我們需要自己寫一個handler針對不同的需求,所以我們下一步來自定義一個Handler,我們繼承DefaultHandler類,然後重寫這裏面,我們上面提到的5個方法:
整個代碼如下:
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
|
public
class
MyHandler extends
DefaultHandler{ //結果的集合 private
List<Student> data = null ; //當前“組裝”
的對象 private
Student student; private
String tag; //記錄當前解析的標籤 @Override public
void
startDocument() throws
SAXException { //文檔的開始 //任務:
初始化集合 data
= new
ArrayList<>(); //
該方法只會執行一次 } @Override public
void
startElement(String uri, String localName, String qName, Attributes attributes)
throws
SAXException { //解析到“元素的開始”
, 系統自動調用 //String
qName : 標籤的名字 //Attributes
attributes :標籤中的屬性(屬性名稱 + 屬性值) //任務1:
記錄當前解析的標籤是什麼, 方便以後的方法使用:characters() tag
= qName; //任務2:
如果是對象的根元素, 那麼創建對象 if ( "student" .equals(qName)) { student
= new
Student(); } } @Override public
void
characters( char []
ch, int
start, int
length) throws
SAXException { String
str = new
String(ch, start, length).trim(); if
( "id" .equals(tag))
{ student.setId(Integer.parseInt(str)); } else
if ( "name" .equals(tag)) { student.setName(str); } else
if ( "age" .equals(tag)) { student.setAge(Integer.parseInt(str)); } else
if ( "sex" .equals(tag)) { student.setSex(str); } } @Override public
void
endElement(String uri, String localName, String qName) throws
SAXException { //解析的元素的結束
qName,正在解析的標籤名 //任務1,
正在解析的標籤如果是student 說明當前解析的對象已經組裝完成了, 可以放入到集合中 if ( "student" .equals(qName)) { data.add(student); } tag
= "" ; } @Override public
void
endDocument() throws
SAXException { //文檔結束 } public
List<Student> getList() { return
data; } } |
這裏解析的是一個student對象,之後在
1
2
3
4
5
6
7
|
parser.parse( "student.xml" ,
handler); List<Student>
data = handler.getList(); for (Student
student:data) { System.out.println(student); } |
就能輸出結果
另外,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
|
<?xml
version="1.0" encoding="UTF-8"?> <students> <student> <id>1</id> <name>zhangsan</name> <age>20</age> <sex>male</sex> </student> <student> <id>2</id> <name>lisi</name> <age>21</age> <sex>female</sex> </student> </students> |
student類根據上面的屬性寫出,然後添加getset方法和toString方法即可