Объяснение ошибки JAXB: неверный байт 1 из 1-байтовой последовательности UTF-8 - PullRequest
5 голосов
/ 14 июня 2010

Мы анализируем документ XML с использованием JAXB и получаем эту ошибку:

[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)

Что именно это означает и как мы можем решить эту проблему?

Мы выполняем кодкак:

jaxbContext = JAXBContext.newInstance(Results.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(getSchema());
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile));

Обновление

Возможно, проблема связана с этим «забавным» символом в файле XML: ¿

Почему это вызывает такую ​​проблему ??

Обновление 2

В файле есть два таких странных символа.Они находятся в середине файла.Обратите внимание, что файл создан на основе данных в базе данных, и эти странные символы каким-то образом попали в базу данных.

Обновление 3

Вот полный фрагмент XML:

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description>

Обновление 4

Обратите внимание, что заголовок <?xml ...?> отсутствует.

HEX для специального символа - BF

Ответы [ 3 ]

3 голосов
/ 15 июня 2010

Итак, ваша проблема в том, что JAXB обрабатывает XML-файлы без заголовка <?xml ...?> как UTF-8, когда ваш файл использует какую-то другую кодировку (возможно, ISO-8859-1 или Windows-1252, если символ 0xBF действительно предназначен длязначит ¿).

Если вы можете изменить производителя файла, вы можете добавить заголовок <?xml ...?> с фактической спецификацией кодировки или просто использовать UTF-8 для записи файла.

Если вы не можетеПри смене производителя вы должны использовать InputStreamReader с явной спецификацией кодировки, потому что (к сожалению) JAXB не позволяет изменить кодировку по умолчанию:

results = (Results) unmarshaller.unmarshal(
   new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); 

Однако это решение хрупкое - оно не работает навходные файлы с заголовком <?xml ...?> с другой спецификацией кодировки.

1 голос
/ 14 июня 2010

Это, вероятно, Порядок следования байтов (BOM) , и это специальная последовательность байтов в начале файла UTF. Честно говоря, они - боль в заднице, и они кажутся особенно распространенными при взаимодействии с системами .net.

Попробуйте перефразировать ваш код, чтобы использовать Reader вместо InputStream:

results = (Results) unmarshaller.unmarshal(new FileReader(inputFile));

A Reader осведомлен о UTF и может лучше сделать это. Проще говоря, передайте File непосредственно Unmarshaller и позвольте JAXBContext беспокоиться об этом:

results = (Results) unmarshaller.unmarshal(inputFile);
0 голосов
/ 14 июня 2010

Звучит так, как будто ваш XML закодирован с помощью UTF-16, но эта кодировка не передается Unmarshaller.С помощью Marshaller вы можете установить это, используя marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16");, но поскольку Unmarshaller не требуется для поддержки каких-либо свойств, я не уверен, как обеспечить это, за исключением того, что ваш XML-документ содержит encoding="UTF-16" в начальном элементе <?xml?>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...