在Android系统中解析XML文件的方法

网友投稿 185 2023-07-30


在Android系统中解析XML文件的方法

前言

    在学习android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码。因此,这里也顺道介绍一下XmlPullParser的使用。

XML

    XML(eXtensible Markup Language)中文名为可扩展标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。

用途

    XML设计用了传送及携带数据信息,不用了表现或展示数据,HTML语言则用了表现数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。

丰富文件——自定文件描述并使其更丰富

    元数据——描述其它文件或网络资讯

    配置文档——描述软件设置的参数

结构

    每个XML文档都由XML序言开始,在前面的代码中第一行就是XML序言,。这一行代码会告诉解析器或浏览器这个文件应该按照XML规则进行解析。但是,根元素的名称是由文档类型定义或XML纲要定义的。

XmlPullParser

    PULL解析xml是基于事件驱动的方式解析XML文件,pull开始解析时,我们可以先通过getEventType()方法获取当前解析事件类型,并且通过next()方法获取下一个解析事件类型。PULL解析器提供了START_DOCUMENT(开始文档)、END_DOCUMENT(结束文档)、START_TAG(开始标签)、END_TAG(结束标签)四种事件解析类型。当处于某个元素时,可以调用getAttributeValue()方法获取属性的值,也可以通过nextText()方法获取本节点的文本值。下面通过一个例子来进行解析。

xml示例文件

    需要解析的xml示例文件代码如下:

耗子

24

boy

璐璐

28

girl

陈善

26

boy

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 getColleagues(String xmlFilePath) {

List colleagues = new ArrayList();

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();

// 设置文件输入流

phttp://arser.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;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅析Android系统中HTTPS通信的实现
下一篇:4种java复制文件的方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~