0

0

Kotlin怎么处理XML数据 Android XML Pull Parser

幻夢星雲

幻夢星雲

发布时间:2025-12-27 08:09:10

|

251人浏览过

|

来源于php中文网

原创

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

kotlin怎么处理xml数据 android xml pull parser

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

Hotpot.ai
Hotpot.ai

AI工具箱(图像、游戏和写作系列工具)

下载
val parser = resources.getXml(R.xml.items)
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)

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 -> { / 可选:处理纯文本节点 / } XmlPullParser.END_TAG -> { / 标签闭合时可做收尾 / } } 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 再取值
  • 异常必须捕获XmlPullParserExceptionIOException 都要 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}")
    }
}

// 使用示例: parser.require("items") while (parser.nextTag() == XmlPullParser.START_TAG) { when (parser.name) { "item" -> parseItem(parser) else -> parser.skip() // 跳过未知标签 } }

// skip() 是 Android API 21+ 提供的便捷方法,自动跳过整个子树

不复杂但容易忽略细节,掌握好事件流转和边界判断,XmlPullParser 在 Kotlin 里既可靠又干净。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

226

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

430

2024.03.01

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1843

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2079

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

914

2024.11.28

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

2658

2024.08.14

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

239

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1706

2023.08.22

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 9.7万人学习

Java 教程
Java 教程

共578课时 | 38.2万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号