You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WearOS开发:如何在Kotlin中实现XML文件的数组读写?

WearOS Kotlin 实现数组的XML文件读写

以下是符合你需求的完整实现,基于Android原生API(无需第三方库),适配WearOS环境:

核心逻辑框架

完全匹配你期望的代码结构:

val fileName = "my_array.xml"
val context = applicationContext // 替换为你的Activity/Service上下文

if (isXmlFilePresent(context, fileName)) {
    // 读取现有数组并修改
    val existingArray = readArrayFromXml(context, fileName)
    existingArray?.let {
        // 示例:添加新元素,你可以根据需求修改数组
        val updatedArray = it + "new_element"
        // 将修改后的数组写入文件
        createXmlAndWriteArray(context, fileName, updatedArray)
    }
} else {
    // 创建新文件并写入初始数组
    val initialData = arrayOf("item1", "item2", "item3")
    createXmlAndWriteArray(context, fileName, initialData)
}

具体实现方法

1. 检查XML文件是否存在

private fun isXmlFilePresent(context: Context, fileName: String): Boolean {
    val targetFile = File(context.filesDir, fileName)
    return targetFile.exists()
}

注:这里使用应用内部存储,文件仅当前应用可访问,无需申请存储权限。

2. 创建XML文件并写入数组

使用Android原生XmlSerializer生成XML结构:

private fun createXmlAndWriteArray(context: Context, fileName: String, dataArray: Array<String>) {
    val targetFile = File(context.filesDir, fileName)
    val serializer = Xml.newSerializer()

    try {
        val fileWriter = FileWriter(targetFile)
        serializer.setOutput(fileWriter)
        
        // 开始XML文档
        serializer.startDocument("UTF-8", true)
        // 根节点<array>
        serializer.startTag("", "array")

        // 遍历数组写入<item>节点
        dataArray.forEach { item ->
            serializer.startTag("", "item")
            serializer.text(item)
            serializer.endTag("", "item")
        }

        // 结束根节点和文档
        serializer.endTag("", "array")
        serializer.endDocument()
        fileWriter.close()
    } catch (e: IOException) {
        e.printStackTrace()
        // 可根据需求添加错误处理逻辑
    }
}

3. 从XML文件读取数组

使用Android原生XmlPullParser解析XML:

private fun readArrayFromXml(context: Context, fileName: String): Array<String>? {
    val targetFile = File(context.filesDir, fileName)
    if (!targetFile.exists()) return null

    val parser = Xml.newPullParser()
    val itemList = mutableListOf<String>()

    try {
        parser.setInput(FileReader(targetFile))
        var eventType = parser.eventType
        var currentItem: String? = null

        while (eventType != XmlPullParser.END_DOCUMENT) {
            val tagName = parser.name
            when (eventType) {
                XmlPullParser.START_TAG -> {
                    // 读取<item>节点的文本内容
                    if (tagName == "item") {
                        currentItem = parser.nextText()
                    }
                }
                XmlPullParser.END_TAG -> {
                    // 将读取到的元素加入列表
                    if (tagName == "item" && currentItem != null) {
                        itemList.add(currentItem)
                        currentItem = null
                    }
                }
            }
            eventType = parser.next()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    } catch (e: XmlPullParserException) {
        e.printStackTrace()
    }

    return itemList.toTypedArray().takeIf { it.isNotEmpty() }
}

扩展说明

  • 若需存储IntArray或其他类型数组,只需修改读写方法中的类型:比如将Array<String>改为IntArray,读取时把parser.nextText()转为toInt()。
  • 如需使用外部存储,需额外申请存储权限(Android 13+需申请READ_MEDIA_IMAGES等细分权限),但WearOS场景下内部存储已满足大部分需求。
  • 可优化异常处理逻辑,比如使用Result类型替代返回null,提升代码健壮性。

内容的提问来源于stack exchange,提问作者FloTec09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:47:38