разбора файла Android UTF-8 - PullRequest
       46

разбора файла Android UTF-8

1 голос
/ 25 октября 2011

У меня есть .xml файлы, которые закодированы в UTF-8.Но всякий раз, когда я пытаюсь проанализировать их на своем планшете (idea pad, lenovo, android 3.1), я получаю ту же ошибку:

org.xml.SAXParseException: Unexpected token (position: TEXT @1:2 in 
java.io.StringReader@40bdaef8).

Это строки, которые выдают исключение:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource inputSource = new InputSource();
inputSource.setCharacterStream(new StringReader(xmlData));
Document doc = db.parse(inputSource); // This line throws exception

Вот мой ввод:

public String getFromFile(ASerializer aserializer) {
    String filename = aserializer.toLocalResource();
    String data = new String();
    try {
        InputStream stream = _context.getResources().getAssets().open(filename);
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        StringBuilder str = new StringBuilder();
        String line = null;
        while((line = reader.readLine()) != null) {
            str.append(line);
        }
            stream.close();
            data = str.toString();
   }

           catch(Exception e) {
       }
       return data;
    }

Файл XML:

<Results>
    <Result title="08/07/2011">
        <Field title="Company one" value="030589674"/>
        <Field title="Company two" value="081357852"/>
        <Field title="Company three" value="093587125"/>
        <Field title="Company four" value="095608977"/>
    </Result>
    <Result title="11/07/2011">
        <Field title="Company one" value="030589674"/>
        <Field title="Company two" value="081357852"/>
    </Result>
</Results>

Я не хочу преобразовывать их в ANSI, поэтому есть ли способ сделатьdb.parse() работа?

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

В этой строке:

BufferedReader reader = new BufferedReader(new InputStreamReader(stream));

Вы читаете из stream, используя кодировку платформы по умолчанию.Это почти наверняка не то, что вы хотите.Вам нужно проверить XML на предмет фактической кодировки, и правильный способ сделать это - несколько сложен .

К счастью, каждый здравомыслящий синтаксический анализатор XML (включая Java / Android)может сделать это самостоятельно.Чтобы заставить синтаксический анализатор XML делать это, просто передайте сам stream вместо попытки прочитать его вручную.

InputSource inputSource = new InputSource(stream);
1 голос
/ 11 октября 2012

Ваша Java-строка в кодировке UTF-16 по умолчанию.Если вы не можете использовать InputStream, как предложил @Joachim Sauer, попробуйте следующее:

Document doc = db.parse(new ByteArrayInputStream(xmlData.getBytes())); 
1 голос
/ 25 октября 2011

Скорее всего, вы используете XML-файл с меткой спецификации (Byte Order Mark).

Либо используйте API, который обнаруживает кодировку из спецификации

Кроме того, предварительно обработайте файл, чтобы не было спецификации.

...