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

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

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

Привет.


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


Ответы (1)


Это может быть проблема с кодировкой символов.
Как видите, ошибка с недопустимым токеном указывает на строку № 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 для выбора подходящей кодировки.

person Tomas Narros    schedule 17.01.2012
comment
Привет @tomas-narros, спасибо, попробую, результат заметишь. - person Lobo; 17.01.2012
comment
Разве синтаксический анализатор не должен точно использовать объявление XML для выбора подходящей кодировки? - person JB Nizet; 17.01.2012
comment
Это хороший момент @JB. Наверняка должно. Но я почти уверен, что это проблема с кодировкой. - person Tomas Narros; 17.01.2012
comment
Привет, @TomasNarros, я пробовал с кодировкой, которую ты мне сказал, но получаю следующую ошибку: Error de sax LectorSAX.java: org.apache.harmony.xml.ExpatParser$ParseException: в строке 1, столбце 0: неизвестная кодировка - person Lobo; 18.01.2012
comment
@Лобо: Хорошо. Похоже, виртуальная машина Android не поддерживает эту кодировку. Как и ISO-8859-15, он в основном совместим с ISO-8859-1, за исключением некоторых специфических символов (как вы можете видеть в en.wikipedia.org/wiki/ISO/IEC_8859-15), я бы попробовал изменить значение ISO-8859-15 на ISO-8859-1 в методе setEncoding. Похоже, что пока ваш Android не поддерживает кодировку, он использует ее по умолчанию (UTF-8), и, следовательно, синтаксический анализатор не может использовать объявление XML для выбора подходящей кодировки. Пожалуйста, проверьте и скажите мне, если это сработало - person Tomas Narros; 19.01.2012
comment
@Lobo: Я рад это слышать. Я обновлю полный ответ, чтобы сделать решение доступным для будущих ссылок. - person Tomas Narros; 20.01.2012
comment
@TomasNarros Я использую парсер XML. В этом методе Xml.parse() не поддерживается InputSource. В этом случае есть идеи? - person Ravi Bhatt; 25.04.2013