android PULL 解析XML

上文中介绍了SAX方式解析XML,本文着中介绍PULL方式解析XML。PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。

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


你可能感兴趣的:(android,xml,String,null,文档,encoding)