当前位置:编程学习 > XML/UML >>

android使用pull的方式解析xml

 

上次已经说过使用sax解析xml了,实际上还可以使用pull解析xml.这样的方式效率也是比较高的。pull不仅可以在android上使用也可以用在javaee里面,需要的就是pull的jar包。这次的xml也使用上次的那个,如下所示

 

 

<?xml version="1.0" encoding="UTF-8"?> 

<persons> 

  <person id="01"> 

     <name>will</name> 

     <age>21</age> 

  </person> 

  <person id="02"> 

     <name>will2</name> 

     <age>22</age> 

  </person> 

</persons> 

 

下面就来写一个解析xml的类,解析的流程如下

 

(1)取得pull解析器

(2)设置解析器的输入流

 

(3)产生第一个事件

 

(4)开始解析

 

(5)解析结束

 

 

package org.lxh.impl; 

 

import java.io.InputStream; 

import java.util.ArrayList; 

import java.util.List; 

 

import org.lxh.vo.Person; 

import org.xmlpull.v1.XmlPullParser; 

import org.xmlpull.v1.XmlPullParserException; 

 

import android.util.Log; 

import android.util.Xml; 

 

public class Parse2 { 

  public List<Person> getPersons(InputStream in) throws Throwable{ 

      Person p=null; 

      List<Person> persons=null; 

      XmlPullParser parser=Xml.newPullParser(); 

      parser.setInput(in, "UTF-8"); 

      int event=parser.getEventType();//产生第一个事件 

      while(event!=XmlPullParser.END_DOCUMENT){  //如果不是文档结束事件 

          switch(event){ 

           case XmlPullParser.START_DOCUMENT: 

               persons=new ArrayList<Person>();  //在文档的开始实例化集合 

               break; 

           case XmlPullParser.START_TAG: 

               String name=parser.getName();//取得当前解析器指向的元素名称 

               if("person".equals(name)){ 

                   p=new Person(); 

                   p.setId(parser.getAttributeValue(0)); 

               } 

               if(p!=null){ 

                   if("name".equals(name)){ 

                       p.setName(parser.nextText()); //取得当前解析器指向的下一个元素的文本节点 

                   } 

                   if("age".equals(name)){ 

                       p.setAge(Integer.parseInt(parser.nextText())); 

                   } 

               } 

               

               break; 

           case XmlPullParser.END_TAG: 

               if("person".equals(parser.getName())){  //person标签结束就把数据存入集合 

                   persons.add(p); 

                   

                   //p=null; 

               } 

               break; 

          } 

          event=parser.next(); 

      } 

      return persons; 

  } 

 

这样的解析比起sax应该比较简单了,单元测试也用昨天那个只是少做了修改。下面看一下效果截图

 

\

作者 chenwill3

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,