Как сказать Java SAX Parser игнорировать недопустимые ссылки на символы? - PullRequest
17 голосов
/ 08 июня 2010

При попытке проанализировать неверный XML с помощью ссылки на символ, такой как &#x1, SAX Parser Java умирает ужасной смертью с фатальной ошибкой, такой как

    org.xml.sax.SAXParseException: Character reference "&#x1"
                                   is an invalid XML character.

Есть ли способ обойти это? Должен ли я очистить файл XML, прежде чем передать его в SAX Parser? Если так, есть ли элегантный способ сделать это?

Ответы [ 3 ]

24 голосов
/ 08 июня 2010

Используйте XML 1.1!skaffman совершенно прав, но вы можете просто прикрепить <?xml version="1.1"?> к вашим файлам, и вы будете в хорошей форме.Если вы имеете дело с потоками, напишите обертку, которая переписывает или добавляет эту инструкцию обработки.

7 голосов
/ 08 июня 2010

Боюсь, вам придется очистить ваш XML.Такие символы недопустимы в соответствии со спецификацией XML, и никакие убеждения не помогут убедить анализатор в противном случае.

Допустимые символы XML для XML 1.0:

  • U+0009
  • U+000A
  • U+000D
  • U+0020 - U+D7FF
  • U+E000 - U+FFFD
  • U+10000 - U+10FFFF

Для очистки вам придется передавать данные через процессор более низкого уровня, который обрабатывает их как поток символов Unicode, удаляя те символы, которые недопустимы.

2 голосов
/ 08 июня 2010

Это недопустимый XML, поэтому парсер не должен анализировать его без ошибок.

Но вы сталкиваетесь с подобным недействительным XML в реальном мире. Мое решение состоит в том, чтобы вручную вставить маркеры CDATA в данные. Например,

  <data><![CDATA[ garbage with &invalid characters ]]></data>

Конечно, вы вернете данные как есть, и вам придется иметь дело с недействительными символами самостоятельно.

...