Проверка документа 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
маркер места, за которым был расположен гипотетический плохой персонаж.
Я немного погуглил, пока ждал ваш байтовый массив.
Вы сказали
Как ни странно, ошибочный документ был сгенерирован путем удаления нескольких элементов из большого документа, который обрабатывается одним и тем же кодом.
Исходя из этого, я подозреваю, что проблема в этой теме, вероятно, ваша проблема