解決Axis2在webservice中遇到特殊字符的無法傳輸的缺陷


在使用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碼中,第031號及第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定義的從12815932個代碼,位於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM