• 解决Axis2在webservice中遇到特殊字符的无法传输的缺陷(<CDATA>数据类型)


    在使用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 == ' ') || (ch == ' ') || (ch == ' ') || 
    ((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]

    以上这个方法也没解决我的问题,后来直接用java.net发送http请求,绕过axis2的处理模式,请求中携带soap字符串就可以通过了。见http://www.cnblogs.com/toSeeMyDream/p/6814437.html

  • 相关阅读:
    TFIDF
    奇异值分解(singular value decomposition,SVD)
    (转载)先验分布
    在博客中写公式的两种方法
    linux 下配置JDK JRE ECLIPSE TOMCAT
    tensor decomposition
    Form界面设置只读
    FORM LOV特性
    在Oracle Form中,如何实现自动编号(行号)的功能
    文件夹错误frm41097,frm41053
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/6816533.html
Copyright © 2020-2023  润新知