Android开发进阶(二)--XML文件解析之PULL模式解析

 

 Pull模式解析原理:

与SAX解析器模拟相似,也提供了类似的事件驱动.使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

Pull模式解析步骤:

1、  得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:

       1)通过Xml这个工具类的.newPullParser()方式得到

       2)通过XmlPullParserFactory工厂创建

//得到XmlPullParserFacotry工厂

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

XmlPullParser xmlparser = factory.newPullParser();


2、  再根据XmlPullParser对象设置输入流和编码格式

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


3、  然后循环遍历所有的结点可以通过文档开始的代码来判断读入到哪个节点

 

关于xmlparser.getEventType()其值有:

Start_DOCUMENT:文档开始

END_DOCUMENT:文档结束

START_TAG:开始读标签

END_TAG:标签结束

TEXT:所读的是文本内容

 

 

一个简单示例:

 import java.io.IOException;
 import java.io.StringReader;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlPullParserFactory;
 public class SimpleXmlPullApp{
      public static void main (String args[])  throws XmlPullParserException, IOException{

         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
         XmlPullParser xpp = factory.newPullParser(); 

         xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) );

         int eventType = xpp.getEventType();

         while (eventType != XmlPullParser.END_DOCUMENT) {

          if(eventType == XmlPullParser.START_DOCUMENT) {

              System.out.println("Start document");

          } else if(eventType == XmlPullParser.START_TAG) {

              System.out.println("Start tag "+xpp.getName());

          } else if(eventType == XmlPullParser.END_TAG) {

              System.out.println("End tag "+xpp.getName());

          } else if(eventType == XmlPullParser.TEXT) {

              System.out.println("Text "+xpp.getText());

          }
          eventType = xpp.next();
         }
         System.out.println("End document");
     }
 }

输出结果:

Start document

Start tag foo

Text Hello World!

End tag foo

  还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里

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;     

           }
           // 下一个节点
           eventCode = parser.next();
       }
       return persons;
    }


 

 

测试:

public class SAXPersonServiceTest extends AndroidTestCase {

     private static final String TAG = "LogTest";

//PULL方式
    public void testPULLReadXml() throws Exception {

        System.out.println("testPULLReadXml");

       InputStream inputStream = SAXPersonServiceTest.class.getClassLoader()

              .getResourceAsStream("person.xml");

       List<Person> list = PULLPersonService.readXml(inputStream);

        System.out.println(list.size());
 
       for (Person person : list) {
           System.out.println(person);
       }
 
    }

}

如需转载引用请注明出处:http://blog.csdn.net/jiahui524
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值