Android XML数据解析——pull技术

Android 使用pull的技术解析XML
1、我们可以使用java自带的PULL来解析XML文件(不是JDK自带的,需要导入包)
2、PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如开始元素和结束元素,使用parser.next()可以进行下一个元素并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进行选择,然后进行相应的处理。当开始解析元素的时候,调用parser.nextText()方法可以获得下一个Text类型的元素。

PULL技术的特点
简单的结构:一个接口,一个工厂组成的PULL解析器
简单易用:pull解析器只有一个重要的方法next方法,他被用来检索下一个事件,而它只有5个常用的属性
START DOCUMENT
START_TAG
TEXT
END_TAG
END_DOCUMENT

缺点:必须要知道节点名称才能进行判断,但后期使用的时候只需要把节点名称改变下,就可以变成非常灵活的工具类了

第一步:新建一个包libs,导入第三方的包,kxml2.2.2, 再在导入的包上点击右键,build path,添加到class path目录。

第二步:建立一个工具类

/*
 * 主要是使用PULL解析XML
 * */
public class pullXMLTools {

	public pullXMLTools() {
		// TODO 自动生成的构造函数存根
	}
	
	//从服务器获取XML文件,以流的形式返回
	//encode 编码格式,要和XML编码格式一致,UTL-8
	public static List<Person> parserXML(InputStream  inputStream, String encode){
		List<Person> list = null;
		Person person = null;//用来装载解析每一个节点的内容
		
		//创建一个XML解析的工厂
		XmlPullParserFactory factory = xmlPullParserFactory.newInstance();
		
		//获得XML解析类的引用
		XMLPullParser parser = factory.newPullParser();
		parser.setInput(InputStream,encode);
		//获得事件的类型
		int eventType = parser.getEventType();
		while(eventType !=XmlPullParser.END_DOCUMENT){//当前触发的事件不等于结束文档标记
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:  //开始节点:<persons>
				list = new ArrayList<Person>();//建立一个集合,准备装载内容
				break;
			
			case xmlPullParser.START_TAG: //开始解析<person id = "23">
				if("person".equals(parser.getName())){
					person = new Person();
					//取出属性值
					int id = Integer.parseInt(parser.getAttributeValue(0)){ //表示第0个属性
						person.setId(id);
					}
				} else if ("name".equals(parser.getName())){
					String name = parser.nextText();//获取该节点的内容
					person.setName(name);
				} else if("age".equals(parser.getName())){
					int age = Integer.parseInt(parser.next());
					person.setAge(age);
				}
				break;
			
			case xmlPullParser.END_TAG: //表示解析到了当前结束节点,也就是当前这个person解析完了
				if("person".equals(parser.getName())){
					list.add(person);
					person = null;  //置空,准备解析下一个节点
				}
				break;
			}
			eventType = parser.next();
		}
		return list;
	}
}

第三步:创建一个Person的实例类

public class Person {
	
	private int id;
	private String name;
	private int age;
	
	public Person() {
		// TODO 自动生成的构造函数存根
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	//为了方便打印输出,生产一个toString 方法
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age
				+ "]";
	}
	
	

}


第四步:获取网络上的输入流
public class httpUtils {
	public httpUtils() {
		// TODO 自动生成的构造函数存根
	}
	//从服务器获取文件返回流
	public static InputStream getXML(String path){
		InputStream inputStream = null;
		try {
			URL url = new URL(path);
			if(url != null){
				HttpURLConnection connection = (HttpURLConnection) url.openConnection();
				connection.setConnectTimeout(3000);
				connection.setDoInput(true);
				connection.setRequestMethod("GET");
				int code = connection.getResponseCode();
				if(code == 200){
					inputStream = connection.getInputStream();
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return inputStream;
	}		
}

第五步:建立测试使用类
public class Test {
	
	public Test() {
		// TODO 自动生成的构造函数存根
	}
	
	public static void main(String[] args){
		String path = "http://192.168.0.102/myHttp/person.xml";
		InputStream inputStream = httpUtils.getXML(path);
		List<Person> list = pullXMLTools.parserXML(inputStream, "utf-8");
		
		//增强for循环,输出person内容
		for(Person person : list){
			System.out.print(person.toString());
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值