java – JAXB错误的说明:1字节UTF-8序列的字节1无效

前端之家收集整理的这篇文章主要介绍了java – JAXB错误的说明:1字节UTF-8序列的字节1无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们正在使用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代码段:

更新4

请注意,没有<?xml ...?>头.

特殊字符的HEX是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 ...?>标头具有不同的编码规范.

猜你在找的Java相关文章