使用 XmlPullParser 解析 XML 格式数据(Kotlin 版)

书上P438讲的很好,看书我觉得更好

1. 概述

XmlPullParser 是 Android 官方提供的轻量级 XML 解析器,适用于资源受限的移动设备。它基于流式解析,不会将整个 XML 加载到内存中,因此适用于大数据量的 XML 解析。

额外知识—选择合适的解析方式:

方式 适用场景 优点 缺点
SAX 大型 XML,逐行解析 低内存占用 编码复杂
DOM 小型 XML,需要修改 易用 内存占用大
XmlPullParser 轻量 XML 解析 性能高 手写解析代码
Simple XML 复杂 XML,映射对象 代码清晰 依赖第三方库

如果你处理的是 Android 端 XML 解析,建议优先使用 XmlPullParser,如果 XML 结构复杂且需要映射对象,可以考虑 Simple XML

2. 使用步骤

2.1 添加依赖

XmlPullParser 是 Android 自带的 API,因此无需额外添加依赖。

2.2 XML 示例数据

假设我们有一个 XML 文件 sample.xml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="1">
<title>Android Development</title>
<author>John Doe</author>
<price>29.99</price>
</book>
<book id="2">
<title>Kotlin for Beginners</title>
<author>Jane Smith</author>
<price>35.50</price>
</book>
</catalog>

2.3 解析 XML 数据

2.3.1 创建 XmlPullParser 对象

1
2
3
val factory = XmlPullParserFactory.newInstance()
val parser = factory.newPullParser()
parser.setInput(xmlData.reader())

2.3.2 解析 XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var eventType = parser.eventType
var tagName: String?
var title = ""
var author = ""
var price = ""

while (eventType != XmlPullParser.END_DOCUMENT) {
when (eventType) {
XmlPullParser.START_TAG -> {
tagName = parser.name
when (tagName) {
"title" -> title = parser.nextText()
"author" -> author = parser.nextText()
"price" -> price = parser.nextText()
}
}
}
eventType = parser.next()

// 输出解析结果
if (title.isNotEmpty() && author.isNotEmpty() && price.isNotEmpty()) {
println("Book: $title, Author: $author, Price: $price")
title = ""
author = ""
price = ""
}
}

3. 解析流程解析

  • XmlPullParser.START_TAG:检测到 XML 元素开始标签时,获取标签名。
  • parser.nextText():提取标签的文本内容。
  • XmlPullParser.END_DOCUMENT:解析结束。

4. 优势

  • 内存占用低:适用于大文件解析。
  • 速度快:只遍历一次 XML。
  • 原生支持:无需额外依赖。

5. 适用场景

  • 解析配置文件(如 AndroidManifest.xml)。
  • 解析网络返回的 XML 数据。
  • 解析 RSS 订阅数据。

6. 总结

XmlPullParser 是 Android 推荐的 XML 解析方式,适用于移动端高效处理 XML 数据。通过流式解析,可以显著降低内存占用,提高应用性能。