Ошибка при разборе XML-файла в DOM

1

Я пытаюсь проанализировать 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 другими способами...

  • 1
    Вы проверили, что файл действительно содержит правильную последовательность байтов для символа большой буквы ? Откройте файл в шестнадцатеричном редакторе, вы должны увидеть последовательность 0xCE 0x94 . Вы?
  • 0
    Да, я вижу 0xCE 0x94 (в окружении 1-байтовых кодов ASCII, представляющих стандартные символы).
Показать ещё 7 комментариев
Теги:
dom
parsing

1 ответ

0

Вы уверены, что файл действительно написан как UTF-8? Очевидно, вы можете открыть его в каком-то редакторе, и он правильно показывает текст, но он может просто сделать хорошее предположение как кодирование.

Другая вещь, которую нужно запомнить, - это все символы Unicode в UTF-8 - парсер просто задыхается, когда он попадает в байтовую последовательность, которая недействительна в объявленной кодировке. UTF-8 - очень прощающая кодировка для использования, поскольку любой символ в 7-битном наборе ASCII закодирован, как если бы он был простым ASCII, а много XML состояло из простых символов ASCII. Затем это улавливает людей, когда появляется нечто не-ASCII, и внезапно появляются дефекты в пути кодирования текста через систему.

Вы можете попробовать отредактировать объявление XML и посмотреть, будет ли он разбираться под другой кодировкой символов; 8859-7 содержит символ Δ - может ли он быть закодирован в этом?

Кроме того, каково исключение?

  • 0
    Это DOME-исключение с detailMessage имени элемента, на котором он сработал ("RΔaEnabled").

Ещё вопросы

Сообщество Overcoder
Наверх
Меню