android中pull解析器

 

Android 确实附带了一个 pull 解析器,其工作方式类似于 SAX。它允许您的应用程序代码从解析器中获取事件,这与 SAX 解析器自动将事件推入处理程序相反。pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件(开始元素和结束元素),但您需要使用 (parser.next() 提取它们。事件将作为数值代码被发送,因此您可以使用一个简单 case-switch。注意,解析并未像 SAX 解析那样监听元素的结束,而是在开始处完成了大部分处理。当某个元素开始时,可以调用 parser.nextText() 从 XML 文档中提取所有字符数据。还需注意,您设置了一个标记(布尔变量 done)来确定何时到达感兴趣内容的结束部分。这允许您提早停止读取 XML 文档,因为您知道代码将不会关心文档的其余部分。这有时非常实用,特别是当您只需要访问一小部分 XML 文档时。通过尽快停止解析,您可以极大地减少解析时间。这种优化对于连接速度较慢的移动设备尤为重要。pull 解析器可以提供一些性能优势以及易用性。它还可以用于编写 XML。

       这也是Android推荐使用的XML文件解析方式。

下面还是写一个测试PULL方式解析XML文件的DEMO

首先新建一个Android工程,工程结构如下图:

 

 

新建一个测试用的XML文件,名称:student.xml

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

<students>

       <student id="20110701100">

              <name>张三</name>

              <age>22</age>

              <sex>男</sex>

       </student >

       <student id="20110701101">

              <name>李四</name>

              <age>24</age>

              <sex>男</sex>

       </student >

<student id="20110701102">

              <name>小丽</name>

              <age>21</age>

<sex>女</sex>

       </student >

</students>

将该文件放置在assets目录下。

 

接下来我们定义一个JavaBean,用来存放从XML文件中解析出来的数据:

Student.java

       package com.xzq.bean;

 

public class Student {

    private String name;

    private String id;

    private int age;

    private String sex;

 

    public String getSex() {

       return sex;

    }

 

    public void setSex(String sex) {

       this.sex = sex;

    }

 

    public Student() {

       super();

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    public String getId() {

       return id;

    }

 

    public void setId(String id) {

       this.id = id;

    }

 

    public int getAge() {

       return age;

    }

 

    public void setAge(int age) {

       this.age = age;

    }

 

}

接着我们定义一个使用PULL方式解析XML文件的工具类:

package com.xzq.pullparser.util;

 

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

 

import org.xmlpull.v1.XmlPullParser;

 

import android.util.Xml;

 

import com.xzq.pullparser.bean.Student;

 

public class ParserByPull {

       public static List<Student> parseXML(InputStream input) {

 

              XmlPullParser parser = Xml.newPullParser();

              try {

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

                     int eventType = parser.getEventType();

                     Student stu = null;

                     List<Student> students = null;

                     while (eventType != XmlPullParser.END_DOCUMENT) {

                            switch (eventType) {

                            case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理

                                   students = new ArrayList<Student>();

                                   break;

                            case XmlPullParser.START_TAG:// 开始元素事件

                                   String name = parser.getName();

                                   if (name.equalsIgnoreCase("student")) {

                                          stu = new Student();

                                          stu.setId(parser.getAttributeValue(null, "id"));

                                   } else if (stu != null) {

                                          if (name.equalsIgnoreCase("name")) {

                                                 stu.setName(parser.nextText());// 如果后面是Text节点,即返回它的值

                                          } else if (name.equalsIgnoreCase("age")) {

                                                 stu.setAge(new Integer(parser.nextText()));

                                          } else if (name.equalsIgnoreCase("sex")) {

                                                 stu.setSex((parser.nextText()));

                                          }

                                   }

                                   break;

                            case XmlPullParser.END_TAG:// 结束元素事件

                                   if (parser.getName().equalsIgnoreCase("student")

                                                 && stu != null) {

                                          students.add(stu);

                                          stu = null;

                                   }

                                   break;

                            }

                            eventType = parser.next();

                     }

                     input.close();

                     return students;

              } catch (Exception e) {

                     e.printStackTrace();

              }

              return null;

       }

}

 

 

最后是MainActivity类,该类是整个Android工程的入口,实现如下:

package com.xzq.xmlparser;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.List;

 

import com.xzq.bean.Student;

import com.xzq.xmlparser.util.ParserBySAX;

 

import android.app.Activity;

import android.content.res.AssetManager;

import android.os.Bundle;

 

public class MainActivity extends Activity {

       /** Called when the activity is first created. */

       @Override

       public void onCreate(Bundle savedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.main);

              AssetManager asset = getAssets();

              try {

                     InputStream input = asset.open("Student.xml");

                     List<Student> list = ParserBySAX.parseXML(input);

                     for (Student stu : list) {

                            System.out.println("Person ID: " + stu.getId() + ","

                                          + stu.getName() + ", " + stu.getAge() + ", "

                                          + stu.getSex());

                     }

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

}

 

在这里,我们仅仅是将解析得到信息打印在了Logcat中,你可以在自己的应用中使用listview等空间将解析得到的数据显示在屏幕上。

 

对于使用PULL方式生成XML文档,下面仅给出一个代码片段,可以根据自己的情况予以适当修改:

      

File xmlFile = new File("myitcast.xml");

FileOutputStream outStream = new FileOutputStream(xmlFile);

OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");

BufferedWriter writer = new BufferedWriter(outStreamWriter);

writeXML(persons, writer);

writer.flush();

writer.close();

如果只想得到生成的xml字符串内容,可以使用StringWriter:

StringWriter writer = new StringWriter();

writeXML(persons, writer);

String content = writer.toString();

public static String writeXML(List<Person> persons, Writer writer){

    XmlSerializer serializer = Xml.newSerializer();

    try {

        serializer.setOutput(writer);

        serializer.startDocument("UTF-8", true);

        serializer.startTag("", "persons");

        for (Person person : persons){

            serializer.startTag("", "person");

            serializer.attribute("", "id", person.getId().toString());

            serializer.startTag("", "name");

            serializer.text(person.getName());

            serializer.endTag("", "name");

            serializer.startTag("", "age");

            serializer.text(person.getAge().toString());

            serializer.endTag("", "age");

            serializer.endTag("", "person");

        }

        serializer.endTag("", "persons");

        serializer.endDocument();

        return writer.toString();

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

欢迎发送邮件到我的邮箱一起交流:zhognnan09@gmail.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值