Android编程解析XML文件的方法详解【基于XmlPullParser】
作者:低调小一 发布时间:2022-09-21 22:48:40
本文实例讲述了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;
}
}
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress
XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat
希望本文所述对大家Android程序设计有所帮助。


猜你喜欢
- 1. 自动化装配介绍Spring Boot针对mvc做了大量封装,简化开发者的使用,内部是如何管理资源配置,Bean配置,环境变量配置以及启
- 本文实例为大家分享了Android studio实现简单计算器的具体代码,供大家参考,具体内容如下话不多说,首先附上代码:MainActiv
- 装饰器模式概述装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),属于结构型模式。它是指在不改
- 一、代码结构:二、数据实体类:using System;using System.Collections.Generic;using Sys
- CountDownLatch 是一个同步工具类,用来协调多个线程之间的同步,它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。
- 目录前言基本概念实践1. 首先准备一个控制台小程序2. 编写使用 AppDomain 的程序一些思考1. 为什么不使用 AppDomain
- 对 Debug 的好奇初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处
- 前言这里用swing ,awt写的。我们大概要做成一个电脑的记事本那样的一个编辑器。可以调整字体,字号,颜色。能够打开、保存文件,新建窗口,
- Java Exception 捕获和显示实例详解 在进行Java B/S架构开发时,经常有这样的场景:后端处理业务逻辑,前端负责
- 在实际的应用程序开发中,我们有时需要把 Activity 设置成全屏显示,一般情况下,可以通过两种方式来设置全屏显示效果:其一,通过在代码中
- 在基于Mybatis-plus实现多租户架构中,介绍了在多租户项目中如果要开启一个子线程,那么需要手动进行RequestAttributes
- 创建SpringBoot项目,启动后,默认的访问路径即主机IP+默认端口号8080:http://localhost:8080/此时,我们就
- ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列
- 在讲使用path绘制多边形时,讲下Canvas的translate(),rotate()方法的使用,本博客中会使用这方面的知识,先单独讲下,
- 本文主要为大家讲解多种Android调试工具的用法。 1. 查看当前
- java读写ini文件、FileOutputStream在上课让学生练习文件读写,就让他们做了一个使用文件保存账号和密码的练习,有一个比较爱
- SpinnerSpinner是一个列表选择框,会在用户选择后,展示一个列表供用户进行选择。Spinner是ViewGroup的间接子类,它和
- 小总结抛出异常:创建异常对象,封装异常信息然后通过throw将异常对象传递给调用者。不对异常进行处理只对异常进行抛出是非常不负责任的表现可以
- 本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下:看过小说都知道小说阅读器翻页有好多种效果,比如
- C#语言有很多值得学习的地方,这里我们主要介绍C#使用if语句。如果想根据一个布尔表达式的结果选择执行两个不同的代码块,就可以C#使用if语