xml解析--Pull方式

xml数据解析
Pull解析方式
    Pull是Android内置的xml解析器(在Android项目中使用Pull解析不需要导入jar包),Android内部的xml文件的解析都使用了Pull解析器。Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:
       1)通过Xml这个工具类的.newPullParser()方式得到(在Android工程中可以使用)
       2)通过XmlPullParserFactory工厂创建

读取到xml的声明返回数字0 START_DOCUMENT;
读取到xml的结束返回数字1 END_DOCUMENT ;
读取到xml的开始标签返回数字2 START_TAG
读取到xml的结束标签返回数字3 END_TAG
读取到xml的文本返回数字4 TEXT
test.xml文件
<? xml version = "1.0" encoding = "UTF-8" ?>
< persons >  
    < person id = "23" >  
        < name > liming </ name >  
        < age > 30 </ age >  
    </ person >  
    < person id = "20" >  
        < name > lixiangmei </ name >  
        < age > 25 </ age >  
    </ person >  
</ persons >
解析的java文件(创建的是java工程,所以需要导入xml2-2.3.0.jar,xmlpull_1_1_3_4c.jar,实体类Person省略,其中有id,name,age三个属性,只有setter和getter方法)
package com.hngd.xmldemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class XmlDemo {
     public static void main(String[] args) {
          XmlDemo xml = new XmlDemo();
          FileInputStream in;
          try {
               in = new FileInputStream(new File("D:\\eclipseWorkSpace\\JsonDemo\\src\\com\\hngd\\xmldemo\\test2.xml"));
               List<Person> list = xml.parseXml(in);
               System.out.println(list.get(0));
               System.out.println(list.get(1));
          } catch (FileNotFoundException e) {
               e.printStackTrace();
          }

     }
    
     private List<Person> parseXml(InputStream in){
          List<Person> list = null;
          Person person = null;
          try {
               XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//获取Pull解析工厂
               XmlPullParser xmlPullparser = factory.newPullParser();//获取XmlPullParser的实例
               //XmlPullParser xmlPullparser = Xml.newPullParser();  //安卓工程中使用Xml工具获取Pull解析器
               xmlPullparser.setInput(in,"UTF-8");  // 设置需要解析的XML数据
               int eventType = xmlPullparser.getEventType();
               while(eventType != XmlPullParser.END_DOCUMENT){   //不是文档的结尾
                    switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:  //1、文档开始。如果为开始解析头标签START_DOCUMENT,初始化数据
                         list = new ArrayList<Person>();
                         break;
                    case XmlPullParser.START_TAG:      //2、标签开始。如果为开始解析属性START_TAG,则获取数据
                         String name = xmlPullparser.getName(); //当前指向元素的名称(节点名称)
                         if("person".equals(name)){
                              person = new Person();
                              person.setId(Integer.parseInt(xmlPullparser.getAttributeValue(0)));
                         }
                        
                         if(person!=null){
                              if("name".equals(name)){
                                   person.setName(xmlPullparser.nextText());
                              }
                              if("age".equals(name)){
                                   person.setAge(Integer.parseInt(xmlPullparser.nextText()));
                              }
                         }
                         break;
                    case XmlPullParser.END_TAG:     //3、标签结束。当触发xml文档结束事件的名称为person(即解析结束位置),将封装对象放入集合,再将对象制空
                         if("person".equals(xmlPullparser.getName())){
                              list.add(person);
                              person = null;
                         }
                         break;
                   
                    }
                    eventType = xmlPullparser.next();
               }
          } catch (XmlPullParserException e) {
               e.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          }
          return list;
         
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值