Android: преобразование XML из необработанной папки в строку

Я столкнулся с проблемой, которая сводит меня с ума xD ... (Во-первых: Привет всем! По какой-то причине я не могу добавить в начало сообщения "Привет всем" в редакции oO...)

Вариант использования следующий: у меня есть файл xml, хранящийся в папке raw моего проекта. XML-файл выглядит примерно так:

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

Я знаю, что есть папка с именем 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
}

Если я теперь выведу полученную строку в logcat, все, что я получу, это набор квадратов, разбросанных по нескольким строкам.

Так что я, должно быть, что-то там упустил... Я уже пробовал несколько способов преобразования этого входного потока в String, и все они в итоге дали один и тот же результат (см. Изображение выше) ...

Спасибо заранее и наилучшими пожеланиями,

zainodis

ОБНОВЛЕНИЕ 12.11.2011

Я попытался сохранить файл xml в папке raw, используя расширение.txt вместо.xml. Теперь преобразование завершается с ошибкой OutOfMemory oO. Я попытался по-другому преобразовать данные, используя предложения из этой темы - все это привело к исключению 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)

3 ответа

Решение

Я вставил этот код в 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, а затем прочитать его. Так как вам нужно только как строка.

Другие вопросы по тегам