我们正在使用 JAXB 解析 XML 文档并收到此错误:
[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 ...?>
header 。
特殊字符的十六进制是BF
最佳答案
所以,你的问题是 JAXB 处理没有 <?xml ...?>
的 XML 文件 header 为 UTF-8,当您的文件使用一些其他编码时(可能是 ISO-8859-1 或 Windows-1252,如果 0xBF
字符实际上意味着 ¿
)。
如果你可以改变文件的制作者,你可以添加<?xml ...?>
具有实际编码规范的 header ,或仅使用 UTF-8 编写文件。
如果你不能改变生产者,你必须使用InputStreamReader
具有显式编码规范,因为(不幸的是)JAXB 不允许更改其默认编码:
results = (Results) unmarshaller.unmarshal(
new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1"));
但是,此解决方案很脆弱 - 它在输入文件上失败 <?xml ...?>
具有不同编码规范的 header 。
关于java - JAXB错误: Invalid byte 1 of 1-byte UTF-8 sequence的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3039998/