在Android系统中解析XML文件的方法
前言
    在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码。因此,这里也顺道介绍一下XmlPullParser的使用。
XML
    XML(eXtensible Markup Language)中文名为可扩展标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
用途
    XML设计用了传送及携带数据信息,不用了表现或展示数据,HTML语言则用了表现数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。
- 丰富文件——自定文件描述并使其更丰富
- 元数据——描述其它文件或网络资讯
- 配置文档——描述软件设置的参数
结构
    每个XML文档都由XML序言开始,在前面的代码中第一行就是XML序言,<?xml version="1.0"?>。这一行代码会告诉解析器或浏览器这个文件应该按照XML规则进行解析。但是,根元素的名称是由文档类型定义或XML纲要定义的。
XmlPullParser
    PULL解析xml是基于事件驱动的方式解析XML文件,pull开始解析时,我们可以先通过getEventType()方法获取当前解析事件类型,并且通过next()方法获取下一个解析事件类型。PULL解析器提供了START_DOCUMENT(开始文档)、END_DOCUMENT(结束文档)、START_TAG(开始标签)、END_TAG(结束标签)四种事件解析类型。当处于某个元素时,可以调用getAttributeValue()方法获取属性的值,也可以通过nextText()方法获取本节点的文本值。下面通过一个例子来进行解析。
xml示例文件
    需要解析的xml示例文件代码如下:
  <?xml version="1.0" encoding="UTF-8"?>
  <colleagues>
    <colleague id="1">
      <name>耗子</name>
      <age>24</age>
      <sex>boy</sex>
    </colleague>
    <colleague id="2">
      <name>璐璐</name>
      <age>28</age>
      <sex>girl</sex>
    </colleague>
    <colleague id="3">
      <name>陈善</name>
      <age>26</age>
      <sex>boy</sex>
    </colleague>
  </colleagues>
XmlPullParser解析器
  package com.example.shakedemo; 
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileReader;
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
  import org.xmlpull.v1.XmlPullParser;
  import org.xmlpull.v1.XmlPullParserException;
  import org.xmlpull.v1.XmlPullParserFactory;
  import android.R.xml;
  import android.util.Log;
  import android.util.Xml; 
  public class XmlPullParserHelper { 
    public static List<Colleague> getColleagues(String xmlFilePath) {
      List<Colleague> colleagues = new ArrayList<Colleague>();
      FileReader xmlReader = null;
      try {
        xmlReader = new FileReader(new File(xmlFilePath));
      } catch (FileNotFoundException e) {
        Log.e("wzy", "Couldn't find xml file " + xmlFilePath);
        return colleagues;
      } 
      try { 
        // 方式1: 使用 Android 提供的android.util.Xml 类获取 parser 对象
        XmlPullParser parser = Xml.newPullParser(); 
        // 方式2: 使用工厂类 XmlPullParserFactory
        // XmlPullParserFactory pullFactory =
        // XmlPullParserFactory.newInstance();
        // XmlPullParser parser = pullFactory.newPullParser(); 
        // 设置文件输入流
        parser.setInput(xmlReader); 
        // 得到当前事件类型
        int eventType = parser.getEventType(); 
        Colleague colleague = null; 
        while (eventType != XmlPullParser.END_DOCUMENT) {
          switch (eventType) {
          case XmlPullParser.START_DOCUMENT:
            break;
          case XmlPullParser.START_TAG:
            /**
             * 通过getName判断读到哪个标签, 然后通过nextText获取文本节点值,
             * 或者通过getAttributeValue(i)获取属性节点值
             */
            String name = parser.getName();
            if ("colleague".equals(name)) {
              colleague = new Colleague();
              colleague.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));
            } else if ("name".equals(name)) {
              if (colleague != null) {
                colleague.setName(parser.nextText());
              }
            } else if ("age".equals(name)) {
              if (colleague != null) {
                colleague.setAge(Integer.parseInt(parser.nextText()));
              }
            } else if ("sex".equals(name)) {
              if (colleague != null) {
                colleague.setSex(parser.nextText());
              }
            } 
            break;
          case XmlPullParser.END_TAG:
            if ("colleague".equals(parser.getName()) && colleague != null) {
              colleagues.add(colleague);
              colleague = null;
            }
            break;
          } 
          eventType = parser.next();
        } 
        xmlReader.close();
      } catch (XmlPullParserException e) {
        // Do nothing
      } catch (IOException e) {
        // Do nothing
      } 
      return colleagues;
    }
  }
其中,colleague类的定义比较简单,代码如下:
 package com.example.shakedemo; 
  public class Colleague {
    private int id;
    private int age;
    private String name;
    private String sex; 
    public int getId() {
      return id;
    } 
    public void setId(int id) {
      this.id = id;
    } 
    public int getAge() {
      return age;
    } 
    public void setAge(int age) {
      this.age = age;
    } 
    public String getName() {
      return name;
    } 
    public void setName(String name) {
      this.name = name;
    } 
    public String getSex() {
      return sex;
    } 
    public void setSex(String sex) {
      this.sex = sex;
    } 
    @Override
    public String toString() {
      return "ID is " + id + ", Name is " + name + ", Sex is " + sex;
    } 
  }
                        
                                                  
                     
