安卓解析XML文件系列2:使用PULL方式

安卓中解析XML文件的方式有三种,下面将第二种方式的使用方法介绍给大家。

使用pull比使用sax代码量少一些,PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件。


PULL特点:
简单的结构:一个接口,一个例外,一个工厂组成的PULL解析器
简单易用:PULL解析器只有一个重要的方法next方法,它被用来检索下一个事件,而它只有5个常用的属性:
START DOCUMENT:从文档开始解析
START_TAG:从标记开始
TEXT:获取文本信息
END_TAG:标记结束
END_DOCUMENT:文档结束


PULL缺点:
使用的时候必须要知道各个节点的名称,才能进行解析。

这个例子实现的是使用PULL方式解析XML文件,将web上的一个xml文件解析出语义。

整体思路:新建一个java工程,定义一个libs目录,引入kxml2-2.2.2.jar这个包。定义一个实体类Person,在里面定义它的字段、get和set方法、toString方法,这个实体类中的字段对应xml文件中的节点。定义一个HttpUtils类,在里面getXML方法,在这个方法中使用字符串类型的网址实例化HttpURLConnection对象,设置它的超时时间、input方式、请求方式、获取返回码,如果请求完成,则以输入流的形式返回结果的信息。定一个PullXMLTools类,定义一个List对象和Person对象,在里面定义一个parseXML方法,在这个方法中创建一个xml解析的工厂,获得xml解析类的引用,获得事件的类型,如果没有解析到文档结尾的话,遇到文档开始,实例化一个List对象,遇到开始标志,如果等于person的话,实例化一个Person对象,取出属性值并赋值给Person对象的相应字段,如果等于name的话,获取节点的内容并赋值给Person对象的相应字段,如果等于age的话,获取节点的内容并赋值给Person对象的相应字段,遇到结束标志,把Person对象加入到List对象中,并把Person对象置空,用于装下一个对象,返回LIst对象。定义一个Test类,在里面定义一个主函数,在这个主函数中以网址为参数调用getXML方法返回一个InputStream对象,以InputStream对象为参数调用parseXML方法,返回一个List对象,遍历List对象,输出里面的所有Person对象的信息。

Person.java文件:

public class Person {
    
	private int id;
	private String name;
	private int age;
	
	public Person() {
		// TODO Auto-generated constructor stub
	}
	
//	写好了字段,可以直接生成构造方法、get、set方法、toString方法
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

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

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}


}

HttpUtils.java文件:

public class HttpUtils {
//从服务器获取xml文件返回流
	public HttpUtils() {
		// TODO Auto-generated constructor stub
	}
	
	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;
	}

}

PullXMLTools.java文件:

public class PullXMLTools {

	public PullXMLTools() {
		// TODO Auto-generated constructor stub
	}
//inputStream从服务器获取xml文件,以流的形式返回;encode编码格式
	public static List<Person> parseXML(InputStream inputStream,String encode) throws Exception{
		List<Person> list=null;
		Person person=null;//装载解析每一个xml节点的信息
//		创建一个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://如果是开始节点
				list=new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if("person".equals(parser.getName())){
					person=new Person();
//					取出属性值
					int id=Integer.parseInt(parser.getAttributeValue(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.nextText());
					person.setAge(age);
				}
				break;
			case XmlPullParser.END_TAG:
				if("person".equals(parser.getName())){
					list.add(person);
					person=null;//把对象置空,用于装下一个对象
				}
				break;
			}
			eventType=parser.next();
		}
		return list;
	}
}

Test.java文件:

public class Test {

	public Test() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args)  {
		// TODO Auto-generated method stub
		String path="http://pc-20150724xmdx:8080/myhttp/person.xml";
		InputStream inputStream=HttpUtils.getXML(path);
		List<Person> list=null;
		
				try {
					list=PullXMLTools.parseXML(inputStream, "utf-8");
					for(Person person:list){
						System.out.println(person.toString());
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
	}

}
person.xml文件:

<persons>
      <person id="23">
           <name>罗志祥</name>
            <age>36</age>
      </person>
      <person id="24">
           <name>周杰伦</name>
            <age>35</age>
      </person>
</persons>









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值