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; } }