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
相关产品推荐
相关产品推荐

