2010-06-14 56 views
5

我们正在使用JAXB解析XML文档并得到以下错误:JAXB错误的说明:1字节UTF-8序列的字节1无效

[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

+1

这意味着输入是腐败....没有更多的信息,我可以说没什么。 – skaffman 2010-06-14 18:54:43

+0

增加了一些更多信息。这有任何意义吗??谢谢你的帮助! – 2010-06-14 19:10:19

+1

您可以发布包含违规文本的XML文件部分吗? – ChrisF 2010-06-14 19:13:46

回答

3

所以,你的问题是,JAXB将XML文件,而无需<?xml ...?>头为UTF-8,当你的文件使用一些其他的编码(可能是ISO-8859-1或Windows 1252,如果​​性格其实意指¿) 。

如果您可以更改文件的制作者,您可以添加<?xml ...?>标题与实际的编码规范,或者只是使用UTF-8编写文件。

如果你不能改变的制片人,你必须使用InputStreamReader有明确的编码规范,因为(不幸)JAXB不允许更改其默认编码:

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

然而,这种解决方案脆弱 - 它在具有不同编码规范的<?xml ...?>标头的输入文件上失败。

+0

谢谢,会尝试。请注意,当我使用Xalan/Java尝试使用XSLT格式化XML文件时,我得到相同的错误。 Xalan是否也采用UTF-8? – 2010-06-14 20:31:15

+0

这很有效!请注意,此代码仅在此文件上运行,它永远不会有xml头。 这种方法与使用这个方法相比有什么优势/差异:'results =(结果)unmarshaller.unmarshal(new FileReader(inputFile));' – 2010-06-14 20:39:38

+1

@Marcus:'FileReader'使用系统默认编码,当InputStreamReader '使用明确指定的一个。 – axtavt 2010-06-14 20:58:44

1

这可能是一个Byte Order Mark (BOM),并且是在UTF文件的开始一个特殊的字节序列。坦率地说,它们是屁股疼痛的一部分,在与.net系统交互时似乎特别常见。

尝试改写代码中使用一个Reader而非InputStream

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

一个Reader是UTF-知道,并且可能在它做出更好的刺。更简单地说,直接传递FileUnmarshaller,并让JAXBContext担心:

results = (Results) unmarshaller.unmarshal(inputFile); 
+0

我可以尝试。请注意,文件中有两个字符 - 请参阅该帖子的第二次更新。 – 2010-06-14 19:22:15

+0

使用'FileReader'看起来不错。当我指定“文件”时出现同样的错误。要验证我所有的结果,但这看起来不错! – 2010-06-14 19:36:02

+0

但是我明白,这些看起来像“怪异”的字符,而不是“字节顺序标记”,不是吗?他们为什么会造成这种麻烦? – 2010-06-14 19:40:16

0

听起来好像你的XML与UTF-16编码但编码不获取传递给Unmarshaller的。使用Marshaller,您可以使用marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16");来设置,但由于Unmarshaller不需要支持任何属性,所以我不确定如何执行该操作,而不是确保您的XML文档在<?xml?>元素中具有encoding="UTF-16"

+1

它不能是UTF-16 - 试图解析UTF-16编码的XML文件,因为UTF-8将由于错误的标记而失败。这可能是一些单字节编码。 – axtavt 2010-06-14 19:50:23

+0

你是对的。我正在查看不同的编码,并混淆了。 – Andy 2010-06-14 20:28:55

相关问题