Я пытаюсь проанализировать XML файл с помощью DocumentBuilderFactory следующим образом:
DocumentBuilderFactory ndsParserFactory = DocumentBuilderFactory.newInstance( );
ndsParserFactory.setNamespaceAware( true );
DocumentBuilder ndsParser = ndsParserFactory.newDocumentBuilder( );
Document ndsDocument = ndsParser.parse( ndsFileInputStream );
где ndsFileInputStream - это InputStream, обертывающий файл, содержащий XML.
Я получаю исключение, когда файл содержит символ Unicode, такой как Δ. Когда я удаляю строку, содержащую оскорбительный символ, разбор работает отлично.
Файл содержит характерный заголовок <?xml version="1.0" encoding="utf-8"?>
.
Мне интересно, не буду ли я неправильно настраивать экземпляр DocumentBuilderFactory (или DocumentBuilder), чтобы обрабатывать символ Δ.
Изменить (из комментариев):
Полное раскрытие: это Android, и я включаю файлы XML (с расширением файла NDS) в качестве активов в своем приложении для Android. Я обращаюсь к ним через AssetManager, у которого есть удобный метод для открытия файла актива в InputStream, который затем передается методу parse моего DocumentBuilder. - d сварки 16 часов назад
Я заметил, что в папке с ресурсами по умолчанию используется кодировка CP1252. Поэтому я изменил это на UTF8. Не повезло. Затем я удалил спецификацию из одного из файлов NDS (по ссылке) и попробовал еще раз. Не повезло. Я думаю, что файл APK (который сжат, как ZIP файл) каким-то образом искажает не-ASCII XML. Я думаю, мне придется прибегать к тому, чтобы получить файлы NDS на устройстве Android другими способами...
Вы уверены, что файл действительно написан как UTF-8? Очевидно, вы можете открыть его в каком-то редакторе, и он правильно показывает текст, но он может просто сделать хорошее предположение как кодирование.
Другая вещь, которую нужно запомнить, - это все символы Unicode в UTF-8 - парсер просто задыхается, когда он попадает в байтовую последовательность, которая недействительна в объявленной кодировке. UTF-8 - очень прощающая кодировка для использования, поскольку любой символ в 7-битном наборе ASCII закодирован, как если бы он был простым ASCII, а много XML состояло из простых символов ASCII. Затем это улавливает людей, когда появляется нечто не-ASCII, и внезапно появляются дефекты в пути кодирования текста через систему.
Вы можете попробовать отредактировать объявление XML и посмотреть, будет ли он разбираться под другой кодировкой символов; 8859-7 содержит символ Δ - может ли он быть закодирован в этом?
Кроме того, каково исключение?
0xCE 0x94
. Вы?