在写入或读取XML 文件时,需要注意对非法字符的过滤
根据W3C的标准,以下16进制的字符是不被允许出现在XML文件中的,即使放在<![CDATE[]]> 中,也不能幸免遇难
//x00-//x08
//x0b-//x0c
//x0e-//x1f
所以,需要对在这3个范围段的字符进行排除
可利用.NET中 Regex的 Replace 方法对字符串中在这3个范围段的字符进行替换,如:
string content = "as fas fasfadfasdfasdf<234234546456";
content = Regex.Replace(content, "[//x00-//x08//x0b-//x0c//x0e-//x1f]", "*");
Response.Write(content);
这样就OK了,如果你还不放心,可以对 <,>,&,'," 这5个符号进行一下特殊处理,即:
< <
> >
& &
' '
" "
Java处理代码
/**
* 使用d替代非法字符.
* @param text
* @param d
* @return
*/
public static String replaceInvaldateCharacter(String text, char d) {
if (text != null) {
char[] data = text.toCharArray();
for (int i = 0; i < data.length; i++) {
if(!isXMLCharacter(data[i]))
data[i] = d;
}
return new String(data);
}
return "";
}
/**
* 使用空格替代非法字符.
* @param text
* @return
*/
public static String replaceInvaldateCharacter(String text) {
return replaceInvaldateCharacter(text, (char)0x20);
}
/**
* 检查字符是否为合法的xml字符
* XML规范中规定了允许的字符范围(http://www.w3.org/TR/REC-xml#dt-character):
* Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
* @param c
* @return
*/
private static boolean isXMLCharacter(int c) {
if (c <= 0xD7FF) {
if (c >= 0x20)
return true;
else
return c == '/n' || c == '/r' || c == '/t';
}
return (c>=0xE000 && c<= 0xFFFD) || (c>=0x10000 && c<= 0x10FFFF);
}
经过非法字符的替换处理后,包含非法XML字符的邮件可以正常阅读。
综上所述,对于wml出现的内容,需要做以下处理:
1、替换非法的XML字符
2、对于可能出现’<’,’/’,’&’,’>’等字符的内容需要进行转义字符替换,或者使用CDATA包起来