Android下XML文本的PULL解析方式

person.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persons> 
       <person id="23"> 
              <name>李明</name> 
              <age>30</age> 
       </person> 
       <person id="20"> 
              <name>李向梅</name> 
              <age>25</age> 
       </person> 
</persons> 
Person类:

public class Person { 
 
    private Integer id; 
    private String name; 
    private short age;     
    public Integer getId() { 
       return id; 
    } 
    public void setId(Integer id) { 
       this.id = id; 
    } 
     public String getName() { 
       return name; 
    } 
    public void setName(String name) { 
       this.name = name; 
    } 
     public short getAge() { 
       return age; 
    } 
    public void setAge(short age) { 
       this.age = age; 
    }  
    @Override 
    public String toString() { 
       return "Person [age=" + age + ", id=" + id + ", name=" + name + "]"; 
    } 

业务bean

public static List<Person> readXml(InputStream inputStream) 
 
         throws Exception { 
 
     List<Person> persons=null; 
 
     // XMLPullParser对象 
 
     XmlPullParser parser = Xml.newPullParser(); 
 
     //设置输入流和编码 
 
     parser.setInput(inputStream, "UTF-8"); 
 
     // 文件开始代码 
 
     int eventCode = parser.getEventType(); 
 
     Person person = null; 
 
     while (eventCode != XmlPullParser.END_DOCUMENT) { 
 
         switch (eventCode) { 
 
         //文档开始 
 
         case XmlPullParser.START_DOCUMENT: 
 
            // 初始化 
 
            persons = new ArrayList<Person>(); 
 
            break; 
 
         case XmlPullParser.START_TAG: //开始标签 
 
            if ("person".equals(parser.getName())) { 
 
               person = new Person(); 
 
               person.setId(Integer.parseInt(parser.getAttributeValue(0))); 
 
            } 
 
            else if(person!=null){ 
 
                if ("name".equals(parser.getName())) { 
 
                   //nextNext()如果下一个元素的内容是文本的时候适合用 
 
                   person.setName(parser.nextText()); 
 
                } 
                else if("age".equals(parser.getName())){ 
                   person.setAge(new Short(parser.nextText())); 
 
                } 
            } 
            break; 
         case  XmlPullParser.END_TAG://结束标签 
 
            if ("person".equals(parser.getName()) && person!=null) { 
 
                persons.add(person); 
 
                person=null;//再掷为null 
 
            } 
 
            break;      
 
         } 
         // 下一个节点  www.2cto.com
         eventCode = parser.next(); 
     } 
     return persons; 
  } 

 

 

 

现在解释下上面的东西,
XmlPullParser 只是个规范,可以到http://xmlpull.org/ 下载。我们来看看这个规范要求我们做些什么。
里面主要的方法有

java 代码

 

  1. //定义一个事件采用回调的方式,直到读取xml完毕。
  2. public int getEventType() throws XmlPullParserException ;
  3. //遍历下一个事件,返回一个事件的类型
  4. public int next() throws XmlPullParserException, IOException
  5. //得到当前Tag名字
  6. public String getName();
  7. //获取文本
  8. public String getText();
  9. //得到当前Tag下面的属性数量
  10. public int getAttributeCount() ;
  11. //得到当前Tag下面指定位置的属性名称
  12. public String getAttributeName(int index);
  13. //得到当前Tag下面指定位置的属性植
  14. public String getAttributeValue(int index);


我们理解了XmlPullParser 可以自己实现一个XmlPullParser。不过java世界里好东西就是多。已经有人帮我们做了。
啊就是kxml。
这个API本身很简单。当时要把一个完整的wml解释并绘制在手机上还是要花相当的时间的。

 
 import java.io.InputStream; 
 import java.util.ArrayList;
 import java.util.List; 
 import org.xmlpull.v1.XmlPullParser; 
 import android.util.Xml; 
 import lee.vo.Person; 
 public class XMLPullService { 
      public List<Person> readXML(InputStream inStream) throws Exception{ 
          List<Person> persons = null; 
          Person person = null; 
          XmlPullParser pullParser = Xml.newPullParser();
          //获取Pull解析器 Xml.newPullParser()添加一个pullParser解析器带命名空间的支持 
          pullParser.setInput(inStream, "UTF-8");
          //设置Pull解析器进行解析的XML内容 
          int event = pullParser.getEventType();    //获取第一个事件 
          while(event!=XmlPullParser.END_DOCUMENT)  //如果还不是结束文档事件,迭代每一个元素 
          {     switch (event) 
                { 
                    case XmlPullParser.START_DOCUMENT: //开始文档事件 
 
                        persons = new ArrayList<Person>(); 
                        break; 
                    case XmlPullParser.START_TAG: //开始元素事件 
                        if("person".equals(pullParser.getName()))
                            //pullParser.getName()得到当前指针所指向的节点的名称 
                        { 
                             person = new Person(); 
                             int id = new Integer(pullParser.getAttributeValue(0)); 
                             person.setId(id); 
                         } 
                        if(person!=null)
                        { 
                            if("name".equals(pullParser.getName()))
                            { 
                                 String name = pullParser.nextText(); 
                                 //得到当前节点下一个文本节点的内容------> <name>liming</name> 得到liming 
                                 person.setName(name); 
                             } 
                             else if("age".equals(pullParser.getName())) 
                             { 
                                 String age = pullParser.nextText(); //获取下一个Text类型节点的值 
                                 person.setAge(new Short(age));
                              }
                        } 
                        break; 
                    case XmlPullParser.END_TAG: //结束元素事件 
                        if("person".equals(pullParser.getName())) 
                        { 
                            persons.add(person); 
                            person = null; 
                         } 
                         break; 
                   } 
                   event = pullParser.next(); //进入下一个元素并触发相应事件
             } 
         return persons; 
    }
 }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值