解決xml解析中報文格式和encoding不一致的解析錯誤

1.錯誤現象

我遇到過這樣的xml文件,用c++解析的時候,報如下的錯誤:

Fatal Error at file "d:/test2.xml", line 1, column 40
   Message: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (? of a 2-byte sequence.

用java解析這個文件的時候,報如下錯誤

Invalid byte 1 of 1-byte UTF-8 sequence.
java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
 at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
 at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
 at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
 at org.apache.xerces.impl.XMLEntityScanner.skipChar(Unknown Source)
 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
 at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
 at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
 at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
 at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
 at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
 at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

 

2.程序內容

java程序內容如下:

c++程序用到了xerces-c,代碼段如下:

 

3.原因分析

文件test2.xml內容如下:

我把這個文件放在本地,用ie打開該文件,解析有問題,不能正常顯示。

修改encoding="gbk",然後說用ie打開,就沒有問題了。

再次運行java程序和c++程序,正常運行,沒有報告錯。

說明文件格式有問題,最簡單的解決辦法就是修改文件的encoding段。

但是有些時候這樣做起來可操作性能不強。

我遇到的問題是,別人發給我一個錯誤的文件,我打電話給對方,告訴他,文件格式有問題,對方不承認,還說別的廠商爲什麼沒有找他,“暈”,死活不修改,而且程序一直會自動運行,手工去修改顯然不顯示,用腳本修改文件的額內容也不好。

 

放心,程序是“萬能”的,平時遇到的所謂bug,看似不可能的問題,認真分析之後,都能通過程序來解決問題。

 

4.分析、解決問題

既然xml文件的內容沒有被編碼爲encoding指定的內容,我們可以把文件的內容讀出來,然後在進行編碼,將編碼後的內容進行解析,問題就解決了。

再不修改文件內容的情況下,修改java程序,內容如下:

運行正確,成功打印出根節點名字。

程序先將文件的內容讀出,然後轉換成utf-8的編碼,組裝成一個字符流進行解析。

 

c++程序也是一樣,先讀出文件內容,然後用icu轉換成utf-8編碼,組裝成內容結構進行解析。

c++程序段內容如下:

上面用到了一些icu的函數,沒有用過icu的兄弟,可以查看一下這方面的資料。

 

 

 

發佈了118 篇原創文章 · 獲贊 21 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章