Android下Xml解析技术(三)、pull解析Xml文件

转载http://blog.csdn.net/lonelyroamer/article/details/7921185

Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。Pull解析xml项目是一个开源的项目,只不过android系统将它集中进去了。

官网:http://www.xmlpull.org

Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。

而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件(开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等),但需要调用next() 方法提取它们(主动提取事件)。

Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创建XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。

下面看看pull技术具体如何解析xml文件。

依然是解析这个简单的文件:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="1">  
  4.         <name>Lucy</name>  
  5.         <age>15</age>  
  6.     </person>  
  7.     <person id="2">  
  8.         <name>Tim</name>  
  9.         <age>20</age>  
  10.     </person>  
  11. </persons>  
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="1">
		<name>Lucy</name>
		<age>15</age>
	</person>
	<person id="2">
		<name>Tim</name>
		<age>20</age>
	</person>
</persons>


解析代码:

  1. public void pullParseXml() throws XmlPullParserException, IOException {  
  2.         // 构建解析器  
  3.         XmlPullParser parser = Xml.newPullParser();  
  4.         // 获得xml文件的输入流,获得文档对象  
  5.         InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");  
  6.         parser.setInput(inputStream, "UTF-8");  
  7.           
  8.                 //开始解析  
  9.         int eventType=parser.getEventType();//产生第一个事件  
  10.         List<Person> persons=null;  
  11.         Person person=null;  
  12.           
  13.         while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件  文档结束  
  14.             switch (eventType) {//判断事件的类型  
  15.             case XmlPullParser.START_DOCUMENT: //开始文档  
  16.                 persons=new ArrayList<Person>();  
  17.                 break;  
  18.             case XmlPullParser.START_TAG:  //开始元素节点  
  19.                 String name1=parser.getName();//获 取解析器当前指向元素节点的名称  
  20.                 if("person".equals(name1)){//如果指向person节点  
  21.                     person=new Person();  
  22.                     person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值  
  23.                 }else if ("name".equals(name1)) {  
  24.                     person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值  
  25.                 }else if ("age".equals(name1)) {  
  26.                     person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值  
  27.                 }  
  28.                 break;  
  29.             case XmlPullParser.END_TAG://结束元素节点  
  30.                 String name2=parser.getName();  
  31.                 if("person".equals(name2)){//如果指向/person节点  
  32.                     persons.add(person);  
  33.                     person=null;  
  34.                 }  
  35.                 break;  
  36.             }  
  37.             eventType=parser.next();//解析器向下移动一个单位  
  38.         }  
  39.         for (Person p : persons) {  
  40.             System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());  
  41.         }  
  42.     }  
public void pullParseXml() throws XmlPullParserException, IOException {
		// 构建解析器
		XmlPullParser parser = Xml.newPullParser();
		// 获得xml文件的输入流,获得文档对象
		InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");
		parser.setInput(inputStream, "UTF-8");
		
                //开始解析
		int eventType=parser.getEventType();//产生第一个事件
		List<Person> persons=null;
		Person person=null;
		
		while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件  文档结束
			switch (eventType) {//判断事件的类型
			case XmlPullParser.START_DOCUMENT: //开始文档
				persons=new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:  //开始元素节点
				String name1=parser.getName();//获 取解析器当前指向元素节点的名称
				if("person".equals(name1)){//如果指向person节点
					person=new Person();
					person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值
				}else if ("name".equals(name1)) {
					person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值
				}else if ("age".equals(name1)) {
					person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值
				}
				break;
			case XmlPullParser.END_TAG://结束元素节点
				String name2=parser.getName();
				if("person".equals(name2)){//如果指向/person节点
					persons.add(person);
					person=null;
				}
				break;
			}
			eventType=parser.next();//解析器向下移动一个单位
		}
		for (Person p : persons) {
			System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());
		}
	}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值