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;
	}

}
    有时间,我会考虑增加其他XML文件的解析方法!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。