Мы анализируем 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 ...?>
заголовок.
ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО для специального символа является BF
Итак, ваша проблема в том, что 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 ...?>
с другой спецификацией кодировки.
Вероятно, это Метка порядка байтов (BOM) и представляет собой особую последовательность байтов в начале файла UTF. Откровенно говоря, это заноза в заднице, и они кажутся особенно распространенными при взаимодействии с системами .net.
Попробуйте перефразировать свой код, чтобы использовать Reader
, а не InputStream
:
results = (Results) unmarshaller.unmarshal(new FileReader(inputFile));
Reader
поддерживает UTF и может помочь лучше на него. Проще говоря, передайте файл
непосредственно в Unmarshaller
, и пусть JAXBContext
позаботится об этом:
results = (Results) unmarshaller.unmarshal(inputFile);
Похоже, ваш XML закодирован с помощью UTF-16, но эта кодировка не передается Unmarshaller. С помощью Marshaller вы можете установить это, используя marshaller.setProperty (Marshaller.JAXB_ENCODING, «UTF-16»);
, но поскольку Unmarshaller не требуется для поддержки каких-либо свойств, я не уверен, как обеспечить соблюдение этого другого чем убедиться, что ваш XML-документ содержит encoding = "UTF-16"
в начальном элементе xml?>
.