XML中特殊字符過濾(含Java代碼)

[size=medium] 在XML規範中,不支持ASCII前31個字符中的相當多控制符號,所以在組裝XML時需過濾這些特殊字符,以免引起解析問題。對於這些特殊字符,常見的異常如:
[quote]Character reference "&#12" is an invalid XML character.

這裏的"&#12表示是ASCII碼的第幾個控制字符[/quote]

同時,'&'(實體引用的開始)和'<'(控制符的開始)作爲XML的標準控制字符[b]必須[/b]不能出現在正常內容中,如果出現的話,需要轉義。XML提供CDATA結構段用來指示XML解析器不要對CDATA段中的數據做處理。但如果在CDATA段中包含CDATA段的關閉符']]>'的話,還是會出現解析問題。

[color=blue]正常CDATA段示例[/color]
[quote]CDStart ::= '<![CDATA['
CData ::= (Char* - (Char* ']]>' Char*))
CDEnd ::= ']]>'[/quote]

用類似的代碼解決這類煩人問題[/size]
/**
* @see http://www.w3.org/TR/2004/REC-xml-20040204/#charsets
* All supported characters
* @param data
* content in each field
* @return
* regular content is filtered from illegal XML char
*/
public static String checkXmlChar(String data) {
StringBuffer appender = new StringBuffer("");

if (StringUtils.isNotBlank(data)) {
appender = new StringBuffer(data.length());

for (int i = 0; i < data.length(); i++) {
char ch = data.charAt(i);
if ((ch == 0x9) || (ch == 0xA) || (ch == 0xD)
|| ((ch >= 0x20) && (ch <= 0xD7FF))
|| ((ch >= 0xE000) && (ch <= 0xFFFD))
|| ((ch >= 0x10000) && (ch <= 0x10FFFF)))
appender.append(ch);
}
}

String result = appender.toString();

return result.replaceAll("]]>", "");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章