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文件的解析方法!

时间: 2024-10-09 19:29:11

Android解析XML文件的相关文章

[android]解析XML文件的方法有三种:PULL,DOM,SAM

PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocument事件. 常用的XML pull的接口和类: XmlPullParser:该解析器是一个在org.xmlpull.v1中定义的解析功能的接口. XmlSerializer:它是一个接口,定义了XML信息集的序列. XmlPullParserFactory:这个类用于在XMPULL V1 API

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析.DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好.但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式. 下面介绍使用DOM解析器对XML进行解析. 下面是我们需要解析的xml文件 <?xml version="1.0" encodin

android如何使用DOM来解析XML文件

对于以下的xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <books> <book email="zhoujunhui&quo

Android中pull解析XML文件的简单使用

首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐的解析方式 看代码: XML文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>孙洋洋</name

Android中Pull解析器解析xml文件案例

首先 准备一个供解析的xml文件,这里我们假定要解析的文件名称为person.xml,文件的具体内容为: <?xml version="1.0" encoding="utf-8"?> <persons> <person id="23"> <name>liming</name> <age>23</age> </person> </persons&g

Android程序解析XML文件的方法及使用PULL解析XML案例

一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM 以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构

Android对XML文件解析

HTTP网络传输中的数据组织方式有三种方式: 1.HTML方式 2.XML方式 3.JSON方式 XML的结构解析如下: 1.节点 2.元素 3.属性和属性值 由于XML的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则是: 1.开始和结束标签匹配 2.嵌套标签不能互相嵌套 3.区分大小写 Android中,解析Xml数据的三种方式: 1.DOM(org.w3c.dom) "文档对象模型"方式,解析完的Xml将生成一个树状结构的对象. 2.SAX(org.xml.sax) S

android 通过pull解析xml文件

1 package com.example.xmldemo.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStreamReader; 9 import java.