關於 Exception:Xml中的非法字元

wb_ustc發表於2009-03-24

http://www.blogjava.net/fingki/archive/2008/09/04/226969.html

About Exception:
An invalid XML character (Unicode: 0x0) was found in the element content of the document.

問題描述:
當我們用
byte[] info ;
DocumentHelper.parseText(new String(info));
將一個位元組陣列轉成字串再轉成Document(XML格式)時,常常會遇到上述異常。
特別是當字串有加、解密,或編碼等情況時。

原因:
從異常來看,很明顯是因為位元組陣列中存在 Unicode: 0x0,而這個位元組在Xml中被認為是非法字元。

對於一些經過編碼或加、解密的字串中,很容易會出現這個 0x0,
特別是在加、解密中,經常會涉及到字元填充,而填充物通常是 0x0,
需對於0x00-0x20 都會引起一定的問題,又因為這些字元不可見,因此用通常的編輯器進行編輯的時候找不到問題所在。
而在轉成String後也覺察不到任何異常。
所以在轉成XML格式時要對字串進行檢測:
*  Verify that no character has a hex value greater than 0xFFFD, or less than 0x20.
* Check that the character is not equal to the tab ("t), the newline ("n), the carriage return ("r), or is an invalid XML character below the range of 0x20. If any of these characters occur, an exception is thrown.

pubic void CheckUnicodeString(String value)
    {
    for (int i=0; i < value.Length; ++i) {
        if (value[i] > 0xFFFD)
        {
            throw new Exception("Invalid Unicode");//或者直接替換掉0x0 value[i]='"n';
        }
        else if (value[i] < 0x20 && value[i] != '"t' & value[i] != '"n' & value[i] != '"r')
        {
            throw new Exception("Invalid Xml Characters");//或者直接替換掉0x0 value[i]='"n';
        }
    }

相關資源:
http://msdn.microsoft.com/en-us/library/k1y7hyy9.aspx
http://gceclub.sun.com.cn/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html

 

以下是我在java中的測試程式:

相關文章