Проверка документа XML приводит к "Недопустимому байту 1 из 1-байтовой последовательности UTF-8".

Я проверяю некоторые XML-файлы на соответствие таблицам стилей Schematron с помощью Probatron4j, который использует Saxon для внутреннего использования. В большинстве случаев это работает нормально, но иногда обработка завершается с ошибкой

org.xml.sax.SAXParseException: недопустимый байт 1 из 1-байтовой последовательности UTF-8.

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

  • явно неверные данные (например, попытка прочитать файл ZIP, как если бы он был файлом XML);
  • наличие меток порядка следования байтов;
  • наличие символов, которые не являются законными в UTF-8; или же
  • документ, который лжет, когда он утверждает, что закодирован в UTF-8.

Ничто из этого не относится к документу, который я обрабатываю. Я проверял ввод в форме байтового массива во время выполнения программы, и он не содержит спецификации или каких-либо не-ASCII символов.

Обработка проходит примерно одну пятую часть моего документа объемом 30 КБ, прежде чем происходит сбой на непримечательном предложении на английском языке (под словом "ничем не примечательный"), я имею в виду, что все байты находятся между 32 (пробел) и 122 (строчные буквы z), другими словами, стандартные символы клавиатуры). Байты предположительно нарушающего элемента находятся в конце этого поста.

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

Я знаю, что исключение бросается в parse(InputSource input) метод объекта, который реализует org.xml.saxXMLReader интерфейс. Согласно Javadoc, SAXException указывает

Любое исключение SAX, возможно, упаковка другого исключения.

Изучение исключения в отладчике показывает, что исключений в оболочке нет.

Что может быть причиной этой ошибки?

РЕДАКТИРОВАТЬ:

[60, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62, 69, 120, 101, 99, 117, 116,
 105, 118, 101, 32, 83, 117, 109, 109, 97, 114, 121, 58, 32, 70, 114, 111, 109,
 32, 49, 55, 53, 52, 32, 116, 111, 32, 49, 55, 54, 51, 13, 10, 32, 32, 32, 32,
 32, 32, 32, 32, 32, 32, 32, 32, 69, 117, 114, 111, 112, 101, 32, 97, 110, 100,
 32, 116, 104, 101, 32, 65, 109, 101, 114, 105, 99, 97, 115, 32, 119, 101, 114,
 101, 32, 99, 97, 117, 103, 104, 116, 32, 117, 112, 32, 105, 110, 32, 97, 32, 99,
 111, 110, 102, 108, 105, 99, 116, 32, 98, 101, 116, 119, 101, 101, 110, 32, 69,
 110, 103, 108, 97, 110, 100, 44, 32, 117, 110, 100, 101, 114, 32, 75, 105, 110,
 103, 32, 71, 101, 111, 114, 103, 101, 32, 73, 73, 44, 32, 97, 110, 100, 32, 70,
 114, 97, 110, 99, 101, 44, 32, 117, 110, 100, 101, 114, 32, 75, 105, 110, 103,
 32, 76, 111, 117, 105, 115, 32, 88, 86, 46, 32, 73, 110, 32, 69, 117, 114, 111,
 112, 101, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 105,
 115, 32, 112, 101, 114, 105, 111, 100, 32, 119, 97, 115, 32, 107, 110, 111, 119,
 110, 32, 97, 115, 32, 116, 104, 101, 32, 83, 101, 118, 101, 110, 32, 89, 101,
 97, 114, 115, 39, 32, 87, 97, 114, 59, 32, 105, 110, 32, 78, 111, 114, 116, 104,
 32, 65, 109, 101, 114, 105, 99, 97, 32, 105, 116, 32, 99, 97, 109, 101, 32, 116,
 111, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 116, 104, 101, 32, 70,
 114, 101, 110, 99, 104, 32, 97, 110, 100, 32, 73, 110, 100, 105, 97, 110, 32,
 87, 97, 114, 46, 32, 73, 116, 32, 119, 97, 115, 32, 97, 32, 99, 111, 110, 102,
 108, 105, 99, 116, 32, 111, 118, 101, 114, 13, 10, 32, 32, 32, 32, 32, 32, 32,
 32, 32, 32, 32, 32, 116, 114, 97, 100, 101, 32, 97, 110, 100, 32, 108, 97, 110,
 100, 46, 60, 47, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62]

Исключение выдается после третьего появления 109,

2 ответа

Решение

Я вроде как решил это. Хотя Java использует UTF-8 для внутренних целей String объекты, String класса getBytes() Метод выдаст байты в кодировке системы по умолчанию, если вы явно не укажете, что хотите UTF-8 (или какую-то другую схему кодирования, которую он понимает).

Я не совсем уверен, как или почему это решает проблему, поскольку байты рядом с местом, где было сгенерировано исключение - те, что в конце вопроса - все были действительными байтами UTF-8 сами по себе, но, похоже, это действительно так. чтобы исправить вещи.

Единственная потенциальная причина, о которой я могу подумать, это то, что я ранее пропустил неверный байт в файле, который испортил все, но не вызвал немедленного сбоя. Я читаю байты из ByteArrayInputStreamтак что вполне возможно, что программа прочитала большой кусок из буфера сразу, что установило pos маркер места, за которым был расположен гипотетический плохой персонаж.

Я немного погуглил, пока ждал ваш байтовый массив.

Вы сказали

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

Исходя из этого, я подозреваю, что проблема в этой теме, вероятно, ваша проблема

Другие вопросы по тегам