首页 > 解决方案 > 使用 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>

标签: androidxmlkotlincharacter-encoding

解决方案


您尝试的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 做的任何事情都是不必要的困难。


推荐阅读