前言
在學習Android的Framework層源碼時,Android大量的使用XmlPullParser來解析xml文件的源碼。因此,這里也順道介紹一下XmlPullParser的使用。
XML
XML(eXtensible Markup Language)中文名為可擴展標記語言。標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種信息的文章等。
用途
XML設計用了傳送及攜帶數據信息,不用了表現或展示數據,HTML語言則用了表現數據,所以XML用途的焦點是它說明數據是什么,以及攜帶數據信息。
- 豐富文件——自定文件描述并使其更豐富
- 元數據——描述其它文件或網絡資訊
- 配置文檔——描述軟件設置的參數
結構
每個XML文檔都由XML序言開始,在前面的代碼中第一行就是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器或瀏覽器這個文件應該按照XML規則進行解析。但是,根元素的名稱是由文檔類型定義或XML綱要定義的。
XmlPullParser
PULL解析xml是基于事件驅動的方式解析XML文件,pull開始解析時,我們可以先通過getEventType()方法獲取當前解析事件類型,并且通過next()方法獲取下一個解析事件類型。PULL解析器提供了START_DOCUMENT(開始文檔)、END_DOCUMENT(結束文檔)、START_TAG(開始標簽)、END_TAG(結束標簽)四種事件解析類型。當處于某個元素時,可以調用getAttributeValue()方法獲取屬性的值,也可以通過nextText()方法獲取本節點的文本值。下面通過一個例子來進行解析。
xml示例文件
需要解析的xml示例文件代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<? xml version = "1.0" encoding = "UTF-8" ?> < colleagues > < colleague id = "1" > < name >耗子</ name > < age >24</ age > < sex >boy</ sex > </ colleague > < colleague id = "2" > < name >璐璐</ name > < age >28</ age > < sex >girl</ sex > </ colleague > < colleague id = "3" > < name >陳善</ name > < age >26</ age > < sex >boy</ sex > </ colleague > </ colleagues > |
XmlPullParser解析器
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
92
93
94
|
package com.example.shakedemo; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import android.R.xml; import android.util.Log; import android.util.Xml; public class XmlPullParserHelper { public static List<Colleague> getColleagues(String xmlFilePath) { List<Colleague> colleagues = new ArrayList<Colleague>(); FileReader xmlReader = null ; try { xmlReader = new FileReader( new File(xmlFilePath)); } catch (FileNotFoundException e) { Log.e( "wzy" , "Couldn't find xml file " + xmlFilePath); return colleagues; } try { // 方式1: 使用 Android 提供的android.util.Xml 類獲取 parser 對象 XmlPullParser parser = Xml.newPullParser(); // 方式2: 使用工廠類 XmlPullParserFactory // XmlPullParserFactory pullFactory = // XmlPullParserFactory.newInstance(); // XmlPullParser parser = pullFactory.newPullParser(); // 設置文件輸入流 parser.setInput(xmlReader); // 得到當前事件類型 int eventType = parser.getEventType(); Colleague colleague = null ; while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: break ; case XmlPullParser.START_TAG: /** * 通過getName判斷讀到哪個標簽, 然后通過nextText獲取文本節點值, * 或者通過getAttributeValue(i)獲取屬性節點值 */ String name = parser.getName(); if ( "colleague" .equals(name)) { colleague = new Colleague(); colleague.setId(Integer.parseInt(parser.getAttributeValue( null , "id" ))); } else if ( "name" .equals(name)) { if (colleague != null ) { colleague.setName(parser.nextText()); } } else if ( "age" .equals(name)) { if (colleague != null ) { colleague.setAge(Integer.parseInt(parser.nextText())); } } else if ( "sex" .equals(name)) { if (colleague != null ) { colleague.setSex(parser.nextText()); } } break ; case XmlPullParser.END_TAG: if ( "colleague" .equals(parser.getName()) && colleague != null ) { colleagues.add(colleague); colleague = null ; } break ; } eventType = parser.next(); } xmlReader.close(); } catch (XmlPullParserException e) { // Do nothing } catch (IOException e) { // Do nothing } return colleagues; } } |
其中,colleague類的定義比較簡單,代碼如下:
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
|
package com.example.shakedemo; public class Colleague { private int id; private int age; private String name; private String sex; public int getId() { return id; } public void setId( int id) { this .id = id; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String getSex() { return sex; } public void setSex(String sex) { this .sex = sex; } @Override public String toString() { return "ID is " + id + ", Name is " + name + ", Sex is " + sex; } } |