Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Саксофон - ExpatParser$ParseException

Автор вопроса: LoboОтветов: 1

Я делаю приложение для Android, которое читает XML-интернет. Это приложение использует SAX для разбора XML. Это мой код для части синтаксического анализа:

public LectorSAX(String url){
    try{
        SAXParserFactory spf=SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        DefaultHandler lxmlr=new LibraryXMLReader() ;
        sp.parse(url, lxmlr);

        nodo=((LibraryXMLReader)lxmlr).getNodoActual();

    }catch(ParserConfigurationException e){
        System.err.println("Error de parseo en LectorSAX.java: "+e);
    }catch(SAXException e){
        System.err.println("Error de sax LectorSAX.java: " + e);
    } catch (IOException e){
        System.err.println("Error de  io LectorSAX.java: " + e);
    }
}

Проблема в том, что возникает SAXException. Сообщение об исключении выглядит следующим образом:

org.apache.harmony.xml.ExpatParser$ParseException: в строке 4 столбец 42: неправильно сформирован (недопустимый токен)

Однако, если я помещу тот же код в обычное приложение Java SE, это исключение не произойдет, и все будет работать нормально.

Почему один и тот же код отлично работает в приложении Java SE, а не в Android? С другой стороны, как решить проблему?

Спасибо за помощь.

Привет.

  • Можете ли вы поделиться своим xml ... и в соответствии с ошибкой есть проблема с вашим xml .. Code_Life 12.01.2012
  • @MohitSharma Но почему тот же код отлично работает в приложении Java SE, а не в Android? Это URL: aemet.es/xml/municipios/localidad_33002.xml. Lobo 12.01.2012
  • оригинал, я думал, что есть какая-то проблема с ur xml из-за ошибки ... но это не так ... теперь единственное решение с u заключается в том, что у вас есть отладка синтаксического анализа Code_Life 12.01.2012
  • Может быть, это как-то связано с кодировкой? Вы используете UTF-8? Я не знаю особенностей Android. Ludovic Kuty 17.01.2012
  • @Ikuti Я не указал кодировку. Я не указал кодировку. Нужна ли она в Android?, Java вроде не требуется. Lobo 17.01.2012

androidjavaxml-parsingsaxparsersax

Ответы

Ответ 1 · рейтинг 11 · Tomas Narros

Это может быть проблема с кодировкой символов.
Как видите, ошибка с недопустимым токеном указывает на строку № 4.
В этой строке вы можете найти острый (Meteorología) и тильда (Испания). Заголовок XML показывает значение кодировки ISO-8859-15. Поскольку это менее распространено, чем кодировки UTF или ISO-8859-1, это может привести к ошибке, когда SAXParser подключается и пытается преобразовать содержимое байтов в символы, используя кодировку вашей системы по умолчанию.

Затем вам нужно указать SAXParser, какую кодировку использовать. Один из способов сделать это - передать InputSource вместо URL к методу разбора. Например:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

InputSource is = new InputSource(url);
is.setEncoding("ISO-8859-15");

DefaultHandler lxmlr=new LibraryXMLReader() ;
sp.parse(is, lxmlr);

EDIT: кажется, что виртуальная машина Android не поддерживает эту кодировку, вызывая исключение org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unknown encoding.
Поскольку ISO-8859-15 в основном совместим с ISO-8859-1, за исключением некоторых определенных символов (как вы можете увидеть здесь), обходной путь заключается в изменении значения ISO-8859-15 на ISO-8859-1 в setEncoding, заставляющий синтаксический анализатор использовать другую, но совместимую кодировку набора символов:

is.setEncoding("ISO-8859-1");

Судя по всему, поскольку Android не поддерживает заявленную кодировку, он использует ее по умолчанию (UTF-8), и, следовательно, синтаксический анализатор не может использовать объявление XML для выбора подходящей кодировки.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы