android使用XmlPullParser来解析XML文件

来源:AI技术网作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《android使用XmlPullParser来解析XML文件》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《android使用XmlPullParser来解析XML文件》有用,将其分享出去将是对创作者最好的鼓励。

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

android使用XmlPullParser来解析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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。