XmlPullParser是Android SDK提供的基于事件驱动的XML解析接口,属于轻量级的解析方案,不需要一次性将整个XML文件加载到内存中,非常适合内存有限的移动端环境。下面我们通过实际案例讲解它的完整使用流程。

XmlPullParser解析XML的核心原理
XmlPullParser采用拉取式的解析模式,开发者主动调用方法获取下一个解析事件,而不是像SAX那样被动接收回调。它的解析事件主要分为几种类型:
- START_DOCUMENT:XML文档开始事件,解析器初始化后会先触发该事件
- START_TAG:遇到XML开始标签时触发,比如<user>这类标签
- TEXT:读取到标签之间的文本内容时触发
- END_TAG:遇到XML结束标签时触发,比如</user>
- END_DOCUMENT:XML文档解析完成事件
我们只要循环获取这些事件,根据不同的事件类型做对应的逻辑处理,就能完成整个XML的解析。
准备待解析的XML文件
我们先在Android项目的assets目录下放置一个测试用的XML文件,命名为user_info.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>XmlPullParser解析完整实现步骤
1. 创建实体类存储解析数据
首先定义一个User类,用来存放每个user标签对应的数据:
public class User {
private int id;
private String name;
private int age;
private String email;
// getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "', age=" + age + ", email='" + email + "'}";
}
}2. 实现XmlPullParser解析逻辑
下面是在Android中读取assets目录下的XML文件,使用XmlPullParser解析的核心代码:
import android.content.Context;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class XmlParserUtil {
public static List<User> parseUsers(Context context) {
List<User> userList = new ArrayList<>();
User currentUser = null;
String currentTagName = null;
try {
// 获取assets目录下的XML文件输入流
InputStream is = context.getAssets().open("user_info.xml");
// 获取XmlPullParser实例,Android推荐用Xml.newPullParser()
XmlPullParser parser = Xml.newPullParser();
// 设置输入流和编码格式
parser.setInput(is, "utf-8");
// 获取第一个事件类型
int eventType = parser.getEventType();
// 循环解析直到文档结束
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
// 文档开始,可在此处做初始化操作
break;
case XmlPullParser.START_TAG:
// 遇到开始标签
String startTagName = parser.getName();
if ("user".equals(startTagName)) {
// 遇到user开始标签,创建新的User对象
currentUser = new User();
// 获取id属性值
String idStr = parser.getAttributeValue(null, "id");
if (idStr != null) {
currentUser.setId(Integer.parseInt(idStr));
}
} else if ("name".equals(startTagName)) {
currentTagName = "name";
} else if ("age".equals(startTagName)) {
currentTagName = "age";
} else if ("email".equals(startTagName)) {
currentTagName = "email";
}
break;
case XmlPullParser.TEXT:
// 遇到文本内容,根据当前标签名赋值
if (currentUser != null && currentTagName != null) {
String text = parser.getText().trim();
if ("name".equals(currentTagName)) {
currentUser.setName(text);
} else if ("age".equals(currentTagName)) {
currentUser.setAge(Integer.parseInt(text));
} else if ("email".equals(currentTagName)) {
currentUser.setEmail(text);
}
}
break;
case XmlPullParser.END_TAG:
// 遇到结束标签
String endTagName = parser.getName();
if ("user".equals(endTagName) && currentUser != null) {
// user标签结束,将对象加入列表
userList.add(currentUser);
currentUser = null;
}
// 重置当前标签名
currentTagName = null;
break;
}
// 获取下一个事件
eventType = parser.next();
}
// 关闭输入流
is.close();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return userList;
}
}3. 调用解析方法验证结果
在Activity中调用解析方法,打印解析结果验证是否正确:
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 调用解析方法
List<User> users = XmlParserUtil.parseUsers(this);
// 打印解析结果
for (User user : users) {
Log.d("XmlParser", user.toString());
}
}
}解析过程中的注意事项
- 解析前要确保XML文件的编码格式和
setInput方法设置的编码一致,否则会出现乱码问题 - 读取文本节点时,最好用
trim()方法去除多余的空白字符,避免空字符串影响数据赋值 - 如果XML文件较大,解析过程建议放在子线程中执行,避免阻塞主线程导致ANR
- 解析完成后要及时关闭输入流,释放资源
- 处理属性值时,
getAttributeValue的第一个参数是命名空间,没有命名空间时传null即可
通过上述步骤,我们就能完整使用XmlPullParser完成Android中XML文件的解析,该方案内存占用低,解析效率高,非常适合日常开发中的XML数据处理场景。
XmlPullParserAndroidXML解析XML文件修改时间:2026-06-06 14:33:32