2012-05-21 4 views
1

Я пытаюсь разобрать файл XML, используя DocumentBuilderFactory следующим образом:Ошибка при разборе файла XML в DOM

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"?> header.

Мне интересно, если я не буду правильно настраивать экземпляр DocumentBuilderFactory (или DocumentBuilder), чтобы обрабатывать символ Δ.

Редактировать (с комментариями):

Полное описание: Это Android, и я в том числе XML-файлы (с расширением файла NDS) в качестве активов в моем Android приложение. Я обращаюсь к ним через AssetManager, у которого есть удобный метод для открытия файла актива в InputStream, который затем передается методу parse моего DocumentBuilder. - d сварка 16 часов назад

Я заметил, что папка с ресурсами использует кодировку CP1252 по умолчанию для своего содержимого. Поэтому я изменил это на UTF8. Не повезло. Затем я удалил спецификацию из одного из файлов NDS (по ссылке) и попробовал еще раз. Не повезло. Я думаю, что файл APK (который сжат, как ZIP-файл) каким-то образом искажает не-ASCII XML. Я думаю, мне придётся прибегнуть к получению файлов NDS на устройство Android другими способами ...

+1

Вы проверили, что файл * на самом деле содержит * последовательность правого байта для символа дефолта [http://www.fileformat.info/info/unicode/char/394/index.htm)? Откройте файл в шестнадцатеричном редакторе, вы увидите последовательность «0xCE 0x94». Вы? – Tomalak

+0

Да, я вижу 0xCE 0x94 (окруженный 1-байтовыми ASCII-кодами, представляющими стандартные символы). – dWeld

+0

Когда вы открываете XML-файл с помощью другого инструмента - например, ваш веб-браузер - он загружается и отображается правильно? Если это так, файл в порядке, и ваша настройка Java неверна. Сравните здесь: http://docs.oracle.com/javase/tutorial/i18n/text/stream.html, а именно третий абзац (* «Если вы опустите идентификатор кодировки ...» *). – Tomalak

ответ

0

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

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

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

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

+0

Это DOMException с detailMessage имени элемента, на котором он включен («RΔaEnabled»). – dWeld

Смежные вопросы