Android 使用SAX解析XML格式数据

1. 概述

SAX(Simple API for XML)是一种基于事件驱动的 XML 解析方式,适用于处理大规模 XML 文档。SAX 解析器不会将整个 XML 加载到内存中,而是逐行解析,因此在 性能和内存占用方面优于 DOM 解析

2. 适用场景

  • 处理大 XML 文件(如 RSS 订阅、日志文件)
  • 流式解析(节省内存)
  • 只需读取数据(无需修改 XML 结构)

3. XML 示例

假设有如下 XML 数据 sample.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<apps>
    <app id="1">
        <name>MyApp</name>
        <version>1.0.0</version>
    </app>
    <app id="2">
        <name>AnotherApp</name>
        <version>2.3.4</version>
    </app>
</apps>

4. SAX 解析步骤

4.1 创建 ContentHandler 处理 XML

SAX 解析基于 ContentHandler 处理 XML 解析事件。

kotlin 复制代码
import android.util.Log
import org.xml.sax.Attributes
import org.xml.sax.helpers.DefaultHandler
​
class AppContentHandler : DefaultHandler() {
    private var nodeName = ""
    private lateinit var id: StringBuilder
    private lateinit var name: StringBuilder
    private lateinit var version: StringBuilder
​
    override fun startDocument() {
        id = StringBuilder()
        name = StringBuilder()
        version = StringBuilder()
    }
​
    override fun startElement(uri: String?, localName: String?, qName: String?, attributes: Attributes?) {
        nodeName = localName ?: ""
        if (localName == "app" && attributes != null) {
            Log.d("AppContentHandler", "App ID: ${attributes.getValue("id")}")
        }
    }
​
    override fun characters(ch: CharArray?, start: Int, length: Int) {
        when (nodeName) {
            "name" -> name.append(ch, start, length)
            "version" -> version.append(ch, start, length)
        }
    }
​
    override fun endElement(uri: String?, localName: String?, qName: String?) {
        if (localName == "app") {
            Log.d("AppContentHandler", "App Name: ${name.toString().trim()}")
            Log.d("AppContentHandler", "App Version: ${version.toString().trim()}")
            name.setLength(0)
            version.setLength(0)
        }
    }
}

4.2 在 Activity 或 Service 中使用 SAX 解析 XML

kotlin 复制代码
import org.xml.sax.InputSource
import java.io.StringReader
import javax.xml.parsers.SAXParserFactory
​
fun parseXml(xmlData: String) {
    val factory = SAXParserFactory.newInstance()
    val parser = factory.newSAXParser()
    val xmlReader = parser.xmlReader
    xmlReader.contentHandler = AppContentHandler()
    xmlReader.parse(InputSource(StringReader(xmlData)))
}

4.3 调用解析函数

xml 复制代码
val xmlData = """
<apps>
    <app id="1">
        <name>MyApp</name>
        <version>1.0.0</version>
    </app>
    <app id="2">
        <name>AnotherApp</name>
        <version>2.3.4</version>
    </app>
</apps>
""".trimIndent()
​
parseXml(xmlData)

5. 解析流程

  1. startDocument() 初始化变量。
  2. startElement() 读取 标签名称属性
  3. characters() 读取 标签内文本
  4. endElement() 处理 数据存储和输出

6. 优势与局限性

优点

内存占用低 (适合大 XML 文件) ✔ 解析速度快 (基于流式处理) ✔ 官方推荐(Android 内置支持)

缺点

不支持随机访问 (只能顺序解析) ✘ 不适合修改 XML 结构(仅适用于读取数据)

7. 适用场景

  • 解析网络请求返回的 XML
  • 处理 RSS 订阅数据
  • 解析配置文件 (如 AndroidManifest.xml

8. 结论

SAX 解析是一种 高效且轻量 的 XML 处理方式,适用于 Android 开发,尤其是需要解析大 XML 数据时。

相关推荐
前端老石人5 分钟前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实5 分钟前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
0xDevNull7 分钟前
Java泛型详解
java·开发语言·后端
yeeanna8 分钟前
GO函数的特殊性
开发语言·后端·golang
Sarvartha16 分钟前
三目运算符
linux·服务器·前端
时空系18 分钟前
第6篇:数据容器——管理大量数据 Rust中文编程
开发语言·后端·rust
晓晨的博客23 分钟前
ROS1录制的bag包转换为ROS2格式
前端·chrome
eLIN TECE26 分钟前
Go基础之环境搭建
开发语言·后端·golang
念何架构之路27 分钟前
Go反射应用技巧
开发语言·后端·golang
Wect31 分钟前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript