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扩展名,然后再读取它。 因为你只需要它作为一个字符串。