PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。
PULL 的工作原理:XMLpull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。
常用的XML pull的接口和类:
XmlPullParser:XML pull解析器是一个在XMLPULLVlAP1中提供了定义解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory:这个类用于在XMPULLV1 API中创建XML Pull解析器。
XmlPullParserException:抛出单一的XMLpull解析器相关的错误。
PULL解析XML的过程:
读取到xml的声明返回START_DOCUMENT;
读取到xml的结束返回END_DOCUMENT ;
读取到xml的开始标签返回START_TAG
读取到xml的结束标签返回END_TAG
读取到xml的文本返回 TEXT
public class Pinfor {
private String serialNumber;
private String serviceid;
private String type;
private String data;
private String title;
private Object reserved;
public String getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(String serialNumber) {
this.serialNumber = serialNumber;
}
public Object getReserved() {
return reserved;
}
public void setReserved(Object reserved) {
this.reserved = reserved;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getServiceid() {
return serviceid;
}
public void setServiceid(String serviceid) {
this.serviceid = serviceid;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
* using pull method to parser XML file
* @param
* @return
*/
public static List<Pinfor> parserXmlByPull(String str,String encoding){
Pinfor infor = null;
List<Pinfor> pushInfors = null;
try {
XmlPullParserFactory pullParserFactory=XmlPullParserFactory.newInstance();
//获取XmlPullParser的实例
XmlPullParser xmlPullParser=pullParserFactory.newPullParser();
//设置输入流 xml文件
xmlPullParser.setInput(new ByteArrayInputStream(str.getBytes(encoding)), encoding);
//xmlPullParser.setInput(inputStream, "UTF-8");
//获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。
int eventType = xmlPullParser.getEventType();
//一直循环,直到文档结束
while (eventType != XmlPullParser.END_DOCUMENT) {
String tag = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT: //文档开始事件
pushInfors = new ArrayList<Pinfor>();
break;
case XmlPullParser.START_TAG: //标签开始事件
if (tag.equals("item")) { //对象标签
infor = new Pinfor();
String attribute = xmlPullParser.getAttributeName(0);
infor.setSerialNumber(attribute);
}
if (infor != null) {
String data = null;
if (tag.equals("serviceid")) { //对象属性标签
data = xmlPullParser.nextText();
infor.setServiceid(data);
}
else if (tag.equals("type")) {
data = xmlPullParser.nextText();
infor.setType(data);
}
else if (tag.equals("title")) {
data = xmlPullParser.nextText();
infor.setTitle(data);
}
else if (tag.equals("data")) {
data = xmlPullParser.nextText();
infor.setData(data);
}
else if (tag.equals("RESERVED")) {
data = xmlPullParser.nextText();
infor.setReserved(data);
}
}
break;
case XmlPullParser.END_TAG:
if (tag.equals("item")&& infor!=null && pushInfors!=null){
pushInfors.add(infor);
infor = null;
}
break;
case XmlPullParser.END_DOCUMENT:
break;
default:
break;
}
eventType = xmlPullParser.next();
}
return pushInfors;
} catch (Exception e) {
// TODO Auto-generated catch block
Log4debug.e(TAG, "parserXmlByPull",e.getMessage());
return null;
}
}