android - 使用 getResource().readText() 读取 xml 文件时遇到问题
问题描述
我正在尝试从我的项目中的资源中读取不同的 xml 文件,在搜索了一段时间后,我发现这getResource().readText()
似乎对大多数人来说都很好。但是,当我尝试这样做时,输出只是一堆
��������������@���������������������。
我不是专家,但我想这与 UTF-8 有关,但我根本找不到答案。
val fileContent =
this::class.java.getResource("/res/xml/test.xml").readText(Charsets.UTF_8)
(我尝试过使用和不使用"Charsets.UTF_8")
我正在尝试读取的 xml 文件:
<?xml version="1.0" encoding="UTF-8"?><request><getInkLevels/></request>
解决方案
您尝试的Class#getResource(String)
方法在Android开发中通常不会使用。规范的做法是使用从实例中Resources
获得的类的Context
实例。您可以阅读开发人员资源指南以了解更多信息。
查看此答案,了解我认为满足您需求的最简单方法。
它建议将您的 XML 文件存储在该/res/raw
目录下,并在运行时通过Resources#openRawResource(int)
. 该方法返回一个您可以读取的输入流,但最适合您。一些 XML 解析库可能直接接受输入流。您也可以像这样将流读入字符串,
import android.content.res.Resources
import androidx.annotation.RawRes
fun readXmlResourceAsString(resources: Resources, @RawRes xmlResId: Int): String =
resources.openRawResource(xmlResId).use { resourceStream ->
String(resourceStream.readBytes(), Charsets.UTF_8)
}
我还要提一下,有一种方法听起来应该更适合您的需求,即Resources#getXml(Int)
. 但是,它返回一个android.content.res.XmlResourceParser
解析能力非常有限的实例。我强烈怀疑你会发现使用这个类来实现你打算用你的 XML 做的任何事情都是不必要的困难。
推荐阅读
- python-3.x - Facebook Messenger bot 的日期选择器 webview - 无法将字段值带回 bot 的输入字段
- php - 检查点防火墙实施后的会话交换
- java - FileReader 和 ActionListner 之间的同步问题,FileReader 在我可以给他任何勇气之前给出空指针;
- apache-spark - 从长转换为时间戳以插入数据库
- docker - 从 jwilder/nginx-proxy 提供静态文件
- xslt - xsl:text 元素中的空格
- mysql - SQL:如何通过连接从不同的表中获取多行?(初学者的问题)
- dialogflow-es - 在谷歌助手中更改表格的背景颜色
- php - Laravel Auth 尝试不使用自定义用户模型
- stunnel - 如何在 linux 服务器中停止 stunnel(仅使用终端),而不是杀死 pid