簡體   English   中英

JAXB錯誤的說明:1字節UTF-8序列的字節1無效

[英]Explanation of JAXB error: Invalid byte 1 of 1-byte UTF-8 sequence

我們正在使用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 ...?>標頭。

特殊字符的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 ...?>標頭的輸入文件失敗。

這可能是字節順序標記(BOM) ,並且是UTF文件開頭的特殊字節序列。 坦率地說,它們是屁股中的痛苦,在與.net系統交互時似乎特別常見。

嘗試重新編寫代碼以使用Reader而不是InputStream

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

Reader可以Reader UTF,並且可以更好地刺激它。 更簡單地說,將File直接傳遞給Unmarshaller ,讓JAXBContext擔心它:

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

聽起來好像你的XML是用UTF-16編碼的,但是這個編碼沒有傳遞給Unmarshaller。 使用Marshaller你可以使用marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16"); 但是因為Unmarshaller不需要支持任何屬性,所以除了確保您的XML文檔在初始<?xml?>元素中具有encoding="UTF-16"之外,我不確定如何強制執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM