[英]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.