推荐使用xmlpullparser,因其轻量高效、内存占用低且为android官方支持;相比dom(易oom)和sax(回调嵌套深),它采用拉模式,配合kotlin的when和作用域函数更简洁可控。

Kotlin 处理 Android 中的 XML 数据,推荐使用 XmlPullParser(XML Pull Parser),它是 Android 官方支持、轻量高效、内存占用低的流式解析器,特别适合移动设备。
为什么选 XmlPullParser 而不是 SAX 或 DOM?
DOM 会把整个 XML 加载进内存,对大文件容易 OOM;SAX 是事件驱动但回调嵌套深、Kotlin 写起来不够直观。XmlPullParser 是“拉模式”:你主动调用 next() 或 nextTag() 推动解析,逻辑清晰、易控制、可随时中断,配合 Kotlin 的 when 和作用域函数写起来很简洁。
基础用法:初始化与循环解析
从资源文件(如 res/xml/config.xml)或输入流中获取解析器实例:
// 示例:解析 res/xml/items.xml
val parser = resources.getXml(R.xml.items)
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
<p>var eventType = parser.eventType
while (eventType != XmlPullParser.END_DOCUMENT) {
when (eventType) {
XmlPullParser.START_TAG -> {
when (parser.name) {
"item" -> {
val id = parser.getAttributeValue(null, "id")
val name = parser.nextText() // 直接读取该标签的文本内容
// 处理 item 对象...
}
"category" -> {
val type = parser.getAttributeValue(null, "type")
val content = parser.nextText()
}
}
}
XmlPullParser.TEXT -> { /<em> 可选:处理纯文本节点 </em>/ }
XmlPullParser.END_TAG -> { /<em> 标签闭合时可做收尾 </em>/ }
}
eventType = parser.next()
}实用技巧与避坑提醒
-
始终检查命名空间:如果 XML 含 namespace(如
xmlns="http://example.com"),需用parser.namespace或传null获取无前缀属性,否则getAttributeValue(null, "attr")可能返回 null -
用
nextTag()简化结构:它自动跳过 TEXT 和 COMMENT,只停在 START_TAG 或 END_TAG,适合已知层级结构的 XML -
避免多次调用
nextText():它隐含执行一次next()并期望下一个事件是 TEXT;若实际是 END_TAG,会抛XmlPullParserException。建议先判断parser.eventType == XmlPullParser.TEXT再取值 -
异常必须捕获:
XmlPullParserException和IOException都要 try-catch,尤其网络加载 XML 时 IO 不稳定
封装成扩展函数提升可读性
可以为 XmlPullParser 添加 Kotlin 扩展,让常见操作更安全简洁:
fun XmlPullParser.require(name: String, ns: String? = null) {
if (eventPosition != START_TAG || name != this.name || ns != this.namespace) {
throw XmlPullParserException("Expected $name but was ${this.name}")
}
}
<p>// 使用示例:
parser.require("items")
while (parser.nextTag() == XmlPullParser.START_TAG) {
when (parser.name) {
"item" -> parseItem(parser)
else -> parser.skip() // 跳过未知标签
}
}// skip() 是 Android API 21+ 提供的便捷方法,自动跳过整个子树
不复杂但容易忽略细节,掌握好事件流转和边界判断,XmlPullParser 在 Kotlin 里既可靠又干净。










