XML Pull解析
Contents
android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。
Pull解析器的运行方式与 SAX 解析器相似。
它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。
跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。
当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
pull解析的事件类型有
- START_DOCUMENT文档开始,getEventType()的初始值
下面的为next()返回值 - START_TAG ,开始标签
- TEXT,文本标签
- END_TAG,结束标签
- END_DOCUMENT,文档结束
eg.
pullparser - XmlUtil.java 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
95
96
97
98
99
100
101
102package net.yrom.xmlparser.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import net.yrom.xmlparser.bean.SmsInfo;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
public class XmlUtil {
/**
生成XML文件
*/
public static void generateXML(File file , List<SmsInfo> smss) throws IOException{
OutputStream out = new FileOutputStream(file);
// 序列化器
XmlSerializer serializer = Xml.newSerializer();
// 初始化输出
serializer.setOutput(out, "UTF-8");
// 创建xml
String namespace = null;
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "smss");
// 循环遍历
for(SmsInfo sms : smss){
serializer.startTag(namespace, "sms");
serializer.attribute(namespace, "id", String.valueOf(sms.getId()));
serializer.startTag(namespace, "body");
serializer.text(sms.getBody());
serializer.endTag(namespace, "body");
serializer.startTag(namespace, "num");
serializer.text(sms.getNum());
serializer.endTag(namespace, "num");
serializer.startTag(namespace, "type");
serializer.text(String.valueOf(sms.getType()));
serializer.endTag(namespace, "type");
serializer.endTag(namespace, "sms");
}
serializer.endTag(namespace, "smss");
serializer.endDocument();
}
/**
解析XML文件
*/
public static List<SmsInfo> parseXML(InputStream in,String encoding) throws Exception{
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, encoding);
List<SmsInfo> smss = null;
SmsInfo sms = null;
int eventType = parser.getEventType();
// EventType不为文档结束时,循环解析
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
// 开始标签
case XmlPullParser.START_TAG:
if("smss".equals(parser.getName())){
smss = new ArrayList<SmsInfo>();
} else if ("sms".equals(parser.getName())){
sms = new SmsInfo();
int id = Integer.parseInt(parser.getAttributeValue(0));
sms.setId(id);
} else if("body".equals(parser.getName())){
String body = parser.nextText();
sms.setBody(body);
} else if("num".equals(parser.getName())){
String num = parser.nextText();
sms.setNum(num);
} else if("type".equals(parser.getName())){
sms.setType(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if("sms".equals(parser.getName())){
smss.add(sms);
}
break;
}
eventType = parser.next();
}
return smss;
}
public static List<SmsInfo> parseXML(File file, String encoding) throws Exception{
return parseXML(new FileInputStream(file), encoding);
}
}pullparser - SmsInfo.java 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
45package net.yrom.xmlparser.bean;
public class SmsInfo {
private String body;
private String num;
private long id;
private int type;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public SmsInfo(String body, String num, long id, int type) {
this.body = body;
this.num = num;
this.id = id;
this.type = type;
}
public SmsInfo() {
}
@Override
public String toString() {
return "Sms:" + body + ",Num=" + num + ",\n ID=" + id
+ ",\n Type=" + type;
}
}pullparser - smss.xml 1
2
3
4
5
6
7
8
9
10
11
12<smss>
<sms id="345">
<body>Hello!</body>
<num>123157</num>
<type>1</type>
</sms>
<sms id="216">
<body>XML Pull</body>
<num>1543132</num>
<type>2</type>
</sms>
</smss>
Author: Yrom
Link: https://yrom.net/blog/2011/12/18/xml-pull-parser/
License: 知识共享署名-非商业性使用 4.0 国际许可协议