Я делаю приложение для 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 · 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 для выбора подходящей кодировки.