Kotlin中使用XmlPullParser解析XML是轻量高效且Android原生支持的拉式解析方式。它比DOM省内存、比SAX易控制流程;无需额外依赖,但需按需声明网络或存储权限;通过XmlPullParserFactory获取实例并设置输入源,利用next()遍历START_TAG、TEXT、END_TAG等事件提取数据,建议封装数据类、处理空值并捕获异常。

Kotlin 中使用 XmlPullParser 解析 XML 是一种轻量、高效且 Android 原生支持的方式。它采用事件驱动的“拉式解析”(pull parsing),比 DOM 更省内存,比 SAX 更易控制流程。
添加依赖与权限(Android 项目)
Android 系统已内置 XmlPullParser,无需额外依赖。但需确保在 AndroidManifest.xml 中声明网络或存储权限(如果 XML 来自网络或本地文件):
- 读取网络 XML:添加
- 读取外部存储 XML:添加
(注意 Android 10+ 的分区存储限制)
获取 XmlPullParser 实例
推荐使用 XmlPullParserFactory 创建实例,并设置输入源:
val factory = XmlPullParserFactory.newInstance() factory.isNamespaceAware = false // 通常可设为 false,除非 XML 含命名空间 val parser = factory.newPullParser() // 示例:从字符串解析 val xmlString = """""" parser.setInput(StringReader(xmlString)) // 或从 InputStream 解析(如 assets 文件或网络响应) // parser.setInput(inputStream, "UTF-8") Kotlin Guide Jane
遍历事件并提取数据
XmlPullParser 通过 next() 或 nextToken() 推进解析位置,返回事件类型。常用事件包括:
-
XmlPullParser.START_TAG:遇到开始标签(如),可用parser.name获取标签名,parser.attributeCount和parser.getAttributeValue(i)读取属性 -
XmlPullParser.TEXT:当前位于文本内容(注意:可能为空白或换行,建议用parser.text.trim().isNotBlank()过滤) -
XmlPullParser.END_TAG:遇到结束标签(如) -
XmlPullParser.END_DOCUMENT:解析完成
典型解析循环结构如下:
var eventType = parser.eventType
while (eventType != XmlPullParser.END_DOCUMENT) {
when (eventType) {
XmlPullParser.START_TAG -> {
when (parser.name) {
"title" -> {
parser.next() // 移动到 TEXT 事件
if (parser.eventType == XmlPullParser.TEXT) {
val title = parser.text.trim()
println("Title: $title")
}
}
"author" -> {
parser.next()
if (parser.eventType == XmlPullParser.TEXT) {
val author = parser.text.trim()
println("Author: $author")
}
}
}
}
}
eventType = parser.next()
}
处理嵌套结构与错误容错
面对复杂 XML(如多本书、带属性的节点),建议封装成数据类,并用栈或状态变量跟踪层级。例如:
- 定义
data class Book(val title: String = "", val author: String = "") - 遇到
时新建临时对象;遇到时加入列表 - 始终检查
parser.text是否为 null 或空白,避免空指针 - 用 try-catch 包裹解析过程,捕获
XmlPullParserException和IOException
不复杂但容易忽略。










