Android:将XML从原始文件夹转换为字符串

我遇到了一个让我疯狂的问题xD ……(首先:大家好!由于某种原因,我无法在编辑开头的post开头加上“大家好”…)

用例如下:我有一个xml文件存储在我项目的原始文件夹中。 xml文件看起来像这样:

Some text 

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

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

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

这会返回一个InputStream,然后我尝试使用以下代码转换为String:

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

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

所以我想我必须在那里遗漏一些东西……我尝试了几种方法将这个输入流转换为String,并且所有这些方法都得到了相同的结果(见上图)…

在此先感谢和最诚挚的问候,

zainodis

更新12.11.2011

我尝试使用扩展名.txt而不是.xml将xml文件保存在原始文件夹中。 现在转换失败,出现OutOfMemoryexceptionoO。 我尝试了使用此线程的建议转换数据的不同方法 – 所有这些都导致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) 

我把这段代码放在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 } 

我不确定你是否还在寻找解决方案,但是如果你或其他任何人想要解决这个问题,那就是我所做的并让它发挥作用。 我完全使用了@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文件在打包之前就像其他XML文件一样编译。 我自己没试过,所以我不能肯定地说。 也许您可以尝试将XML文件重命名为.txt扩展名,然后再读取它。 因为你只需要它作为一个字符串。