在使用Axis2进行soa webservice开发时,遇到类似以下的错误信息:
com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:509)
Invalid white space character (0x1) in text to output
Invalid white space character (0x2) in text to output
……
Invalid white space character (0x7) in text to output
Invalid white space character (0x8) in text to output
……
Invalid white space character (0x11) in text to output
Invalid white space character (0x14) in text to output
问题:
在XML规范中,不支持ASCII前31个字符中的相当多控制符号,所以在组装XML时需过滤这些特殊字符,以免引起解析问题。同时,'&'(实体引用的开始)和'<'(控制符的开始)作为XML的标准控制字符必须不能出现在正常内容中,如果出现的话,需要转义。XML提供CDATA结构段用来指示XML解析器不要对CDATA段中的数据做处理。但如果在CDATA段中包含CDATA段的关闭符']]>'的话,还是会出现解析问题。
解决方案:
?public static String wrapXmlContent(String content)
{
StringBuffer appender = new StringBuffer("");
if ((content != null) && (!content.trim().isEmpty())) {
appender = new StringBuffer(content.length());
for (int i = 0; i < content.length(); i++) {
char ch = content.charAt(i);
if ((ch == '\t') || (ch == '\n') || (ch == '\r') ||
((ch >= ' ') && (ch <= 55295)) ||
((ch >= 57344) && (ch <= 65533)) || (
(ch >= 65536) && (ch <= 1114111))) {
appender.append(ch);
}
}
}
String result = appender.toString();
return "<![CDATA[" + result.replaceAll("]]>", "]]<") + "]]>";
}
控制符号:
控制字符
控制字符(Control Character),出现于特定的信息文本中,表示某一控制功能的字符。 在ASCⅡ码中,第0~31号及第127号(共33个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。
US-ASCII控制字符Seq |
十进 |
十六进 |
缩写 |
字符名 |
00 |
0x00 |
NUL |
Null (空) |
|
^A |
01 |
0x01 |
SOH |
Start of Heading (报头开始) |
^B |
02 |
0x02 |
STX |
Start of Text (正文开始) |
^C |
03 |
0x03 |
ETX |
End of Text (正文结束) |
^D |
04 |
0x04 |