Sax - ExpatParser $ ParseException - PullRequest
       25

Sax - ExpatParser $ ParseException

5 голосов
/ 12 января 2012

Я делаю приложение для 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? С другой стороны, как решить проблему?.

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

Привет.

1 Ответ

11 голосов
/ 17 января 2012

Это может быть проблема кодировки символов.
Как видите, ошибка неверного токена указывает на строку # 4.
В этой строке вы можете найти острый ( Meteorología ) и тильду ( Españ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 для выбора кодировки apropiate.

...