【问题标题】:Android: Converting an XML from the raw folder to stringAndroid:将原始文件夹中的 XML 转换为字符串
【发布时间】:2011-12-27 01:00:07
【问题描述】:

我遇到了一个让我发疯的问题 xD ...(首先:大家好!出于某种原因,我不能在编辑 oO 的帖子开头添加“大家好”...)

用例如下:我在项目的原始文件夹中存储了一个 xml 文件。 xml 文件如下所示:

<myxml ....>Some text<innerelement ... /></myxml>

我知道有一个名为 xml 的文件夹,但我需要的是一个字符串 - 而不是 XmlResourceParser(调用 context.getResources().getXml(id) 时会得到它)。

现在,我加载这个原始 xml 文件的方法是:

context.getResources().openRawResource(R.raw.myfile)

这将返回一个 InputStream,然后我尝试使用以下代码将其转换为字符串:

try {
   byte[] buffer = new byte[stream.available()];
   stream.read(buffer);
   stream.close();
   return new String(buffer);
} catch (IOException e) {
   // Error handling
}

如果我现在将生成的字符串打印到 logcat,我得到的只是一堆正方形,分布在几行上。

所以我想我一定是遗漏了一些东西......我已经尝试了几种将这个输入流转换为字符串的方法,所有这些方法都得到了相同的结果(见上图)......

在此先感谢并致以最诚挚的问候,

扎伊诺迪斯

2011 年 11 月 12 日更新

我尝试使用扩展名 .txt 而不是 .xml 将 xml 文件保存在原始文件夹中。现在转换失败并出现 OutOfMemory 异常 oO。我尝试了不同的方法来使用来自this thread 的建议来转换数据 - 所有这些都导致了 OutOfMemoryException:

11-12 06:09:22.671: I/TestRunner(652): java.lang.OutOfMemoryError
11-12 06:09:22.671: I/TestRunner(652):  at java.util.Scanner.expandBuffer(Scanner.java:2183)
11-12 06:09:22.671: I/TestRunner(652):  at java.util.Scanner.readMore(Scanner.java:2143)
11-12 06:09:22.671: I/TestRunner(652):  at java.util.Scanner.findPostDelimiter(Scanner.java:2121)
11-12 06:09:22.671: I/TestRunner(652):  at java.util.Scanner.setTokenRegion(Scanner.java:2031)
11-12 06:09:22.671: I/TestRunner(652):  at java.util.Scanner.next(Scanner.java:1017)
11-12 06:09:22.671: I/TestRunner(652):  at java.util.Scanner.next(Scanner.java:993)
11-12 06:09:22.671: I/TestRunner(652):  at de.softcon.mobileapp.framework.core.configuration.utility.StringUtils.InputStreamToString(StringUtils.java:69)
11-12 06:09:22.671: I/TestRunner(652):  at de.softcon.mobileoffences.domainmodel.serialization.test.CorpusDelictiFactoryTest.testSerialization(CorpusDelictiFactoryTest.java:32)
11-12 06:09:22.671: I/TestRunner(652):  at java.lang.reflect.Method.invokeNative(Native Method)
11-12 06:09:22.671: I/TestRunner(652):  at java.lang.reflect.Method.invoke(Method.java:507)
11-12 06:09:22.671: I/TestRunner(652):  at junit.framework.TestCase.runTest(TestCase.java:154)
11-12 06:09:22.671: I/TestRunner(652):  at junit.framework.TestCase.runBare(TestCase.java:127)
11-12 06:09:22.671: I/TestRunner(652):  at junit.framework.TestResult$1.protect(TestResult.java:106)
11-12 06:09:22.671: I/TestRunner(652):  at junit.framework.TestResult.runProtected(TestResult.java:124)
11-12 06:09:22.671: I/TestRunner(652):  at junit.framework.TestResult.run(TestResult.java:109)
11-12 06:09:22.671: I/TestRunner(652):  at junit.framework.TestCase.run(TestCase.java:118)
11-12 06:09:22.671: I/TestRunner(652):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
11-12 06:09:22.671: I/TestRunner(652):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
11-12 06:09:22.671: I/TestRunner(652):  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
11-12 06:09:22.671: I/TestRunner(652):  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)

【问题讨论】:

    标签: java android xml render-to-string


    【解决方案1】:

    我将此代码放在onCreate(...) 中。它可以显示xml文件中的字符串。

    InputStream stream = getResources().openRawResource(R.raw.data);
    try {
            byte[] buffer = new byte[stream.available()];
            stream.read(buffer);
            stream.close();
            Log.i("xml", new String(buffer));
    } catch (IOException e) {
        // Error handling
    }
    

    【讨论】:

    • 感谢您的提示 - 事情是我已经在这样做了;)这就是我发现“如果我现在将生成的字符串打印到 logcat,我得到的只是一堆正方形,展开跨越几行。” - 我已经在我的原始帖子中写过这个。所以问题是 --> 为什么在记录转换后的字符串时不是预期的 xml 而是一堆正方形。
    • 是关于字符编码的吗?
    • Mhhh 不这么认为......我确保 xml 被格式化为 UTF-8 - 所以我不认为它是编码......
    • 我没有找到解决方案,所以我放弃了这个问题 - 我会将你的答案标记为正确的答案,因为这就是它应该工作的方式,但不幸的是不适合我,因为不管是什么原因:(
    【解决方案2】:

    我不确定您是否仍在寻找解决方案,但如果您或其他任何人正在寻求解决此问题,这就是我所做的并让它发挥作用。 我完全使用了@wannik 所做的,但指定了我想使用的 charsetName。所以我的代码看起来像这样:

    InputStream stream = getResources().openRawResource(R.raw.data);
    try {
        byte[] buffer = new byte[stream.available()];
        stream.read(buffer);        
        stream.close();
        String xml = new String(buffer, "UTF-8");      // you just need to specify the charsetName   
    } catch (IOException e) {
        // Error handling
    }
    

    希望这会有所帮助。

    【讨论】:

    • 感谢分享这个答案 :) !我最终将我的文件放入 xml 文件夹,它工作正常,即使是更大的文件。但它可能会帮助与我当时情况相似的人。
    【解决方案3】:

    从您的描述来看,放在 raw 文件夹中的 XML 文件似乎在打包之前与其他 XML 文件一样被编译。我自己没有尝试过,所以我不能肯定地说。也许您可以尝试将您的 XML 文件重命名为具有 .txt 扩展名,然后阅读它。因为你只需要它作为一个字符串。

    【讨论】:

    • 感谢您的提示 - 我会试试这个。
    • 我已经尝试过了,将我的 xml 保存为 .txt 我现在得到的是内存不足异常,无论我尝试哪种转换方法 oO ...
    • 我想补充一下,这个xml文件真的一点都不大,这让我想知道OOM异常......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2013-03-20
    • 1970-01-01
    • 2017-09-02
    • 2014-06-16
    • 1970-01-01
    相关资源
    最近更新 更多