前言
在学习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;
}
}
|