在使用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 |
EOT |
End of Transmission (傳輸結束) |
^E |
05 |
0x05 |
ENQ |
Enquiry (查詢) |
^F |
06 |
0x06 |
ACK |
Acknowledge (確認) |
^G |
07 |
0x07 |
BEL |
Bell (振鈴) |
^H |
08 |
0x08 |
BS |
Backspace (退格) |
^I |
09 |
0x09 |
HT |
Horizontal Tab (水平制表) |
^J |
10 |
0x0A |
LF |
Line Feed (饋行) |
^K |
11 |
0x0B |
VT |
Vertical Tab (垂直制表) |
^L |
12 |
0x0C |
FF |
Form Feed (饋頁) |
^M |
13 |
0x0D |
CR |
Carriage Return (回車) |
^N |
14 |
0x0E |
SO |
Shift Out (移出) |
^O |
15 |
0x0F |
SI |
Shift In (移入) |
^P |
16 |
0x10 |
DLE |
Data Link Escape (數據鏈路轉義) |
^Q |
17 |
0x11 |
DC1 |
Device Control 1 (設備控制1) |
^R |
18 |
0x12 |
DC2 |
Device Control 2 (設備控制2) |
^S |
19 |
0x13 |
DC3 |
Device Control 3 (設備控制3) |
^T |
20 |
0x14 |
DC4 |
Device Control 4 (設備控制4) |
^U |
21 |
0x15 |
NAK |
Negative Acknowledge (否認) |
^V |
22 |
0x16 |
SYN |
Synchronous Idle (同步空閑) |
^W |
23 |
0x17 |
ETB |
End of Transmission Block (傳輸塊結束) |
^X |
24 |
0x18 |
CAN |
Cancel (取消) |
^Y |
25 |
0x19 |
EM |
End of Medium (介質結束) |
^Z |
26 |
0x1A |
SUB |
Substitute (替換) |
^[ |
27 |
0x1B |
ESC |
Escape (轉義) |
^\ |
28 |
0x1C |
FS |
File Separator (文件分隔符) |
^] |
29 |
0x1D |
GS |
Group Separator (分組符) |
^^ |
30 |
0x1E |
RS |
Record Separator (記錄分隔符) |
^_ |
31 |
0x1F |
US |
Unit Separator (單元分隔符) |
127 |
0x7F |
DEL |
Delete (刪除) |
[1] 兼容的八位ISO/IEC 8859-1加上了從ISO/IEC 6429定義的從128到159的32個代碼,位於0x80-0x9F。
ISO-8859-n 的控制字符十進 |
十六進 |
縮寫 |
字符名 |
128 |
0x80 |
PAD |
Padding Character(填充字符) |
129 |
0x81 |
HOP |
High Octet Preset(高字節前置) |
130 |
0x82 |
BPH |
Break Permitted Here(此處允許中斷) |
131 |
0x83 |
NBH |
No Break Here(此處禁止中斷) |
132 |
0x84 |
IND |
Index(索引) |
133 |
0x85 |
NEL |
Next Line(下一行) |
134 |
0x86 |
SSA |
Start of Selected Area(選擇區域開始) |
135 |
0x87 |
ESA |
End of Selected Area(選擇區域結束) |
136 |
0x88 |
HTS |
Horizontal Tab Set(水平制表設置) |
137 |
0x89 |
HTJ |
Horizontal Tab Justified(水平制表調整) |
138 |
0x8A |
VTS |
Vertical Tab Set(垂直制表設置) |
139 |
0x8B |
PLD |
Partial Line Forward(部分行前移) |
140 |
0x8C |
PLU |
Partial Line Backward(部分行后移) |
141 |
0x8D |
RI |
Reverse Line Feed(逆向饋行) |
142 |
0x8E |
SS2 |
Single-Shift 2 (單個移動 2) |
143 |
0x8F |
SS3 |
Single-Shift 3(單個移動 3) |
144 |
0x90 |
DCS |
Device Control String(設備控制串) |
145 |
0x91 |
PU1 |
Private Use 1(私用1) |
146 |
0x92 |
PU2 |
Private Use 2(私用2) |
147 |
0x93 |
STS |
Set Transmit State(發送規則設置) |
148 |
0x94 |
CCH |
Cancel Character(取消字符) |
149 |
0x95 |
MW |
Message Waiting(消息等待) |
150 |
0x96 |
SPA |
Start of Protected Area(保護區域開始) |
151 |
0x97 |
EPA |
End of Protected Area(保護區域結束) |
152 |
0x98 |
SOS |
Start of String(串開始) |
153 |
0x99 |
SGCI |
Single Graphic Char Intro(單個圖形字符描述) |
154 |
0x9A |
SCI |
Single Char Intro(單個字符描述) |
155 |
0x9B |
CSI |
Control Sequence Intro(控制順序描述) |
156 |
0x9C |
ST |
String Terminator(串終止) |
157 |
0x9D |
OSC |
OS Command(操作系統指令) |
158 |
0x9E |
PM |
Private Message(私訊) |
159 |
0x9F |
APC |
App Program Command(應用程序命令) [2] |
ps:不完全解決方案見http://win-you-you.iteye.com/blog/623711