<![CDATA[ ]]>

曾经终败给现在 2022-07-16 06:13 233阅读 0赞

问题引入:

这里写图片描述

最近在开发webservice + xml协议的接口时发现一个问题:webservice配置文件如上图所示(生成请求xml报文的原理:解析requestSameSpace标签和variableSameSpace标签下的内容,将其合并为一个完整的请求报文),当我把xml格式的文本使用<![CDATA[ ]]> 包裹起来的时候能生成正确xml格式的报文;而如果不使用<![CDATA[ ]]> 来包裹,尽管你在webservice的配置文件中是以xml格式定义的文本,但是生成的报文却是map格式的。报文如下图所示:

生成的错误的map格式的报文:

这里写图片描述

生成的正确的xml格式的报文:

这里写图片描述

CDATA

这就促使我去查了一些资料,有关<![CDATA[ ]]> 的用途,整理如下:

CDATA的定义:

CDATA DTD的属性类型,全名character data,指不由xml解析器进行解析的文本数据。在标记的CDATA下,所有的标记、实体引用(特殊字符)都会被忽略,而被当作字符数据来看待

CDATA的形式:

CDATA的形式如下: <![CDATA[文本内容]]> CDATA的文本内容中不能出现字符串“]]>”,也不能嵌套。 CDATA区域是由“<![CDATA["为开始标记,以“]]>”为结束标记,注意CDATA为大写。

DTD实例:

指定类型为CDATA以后就可以在XML中被用于实例,例如下面payment 元素的type属性被指定为CDATA类型后在XML中就可以赋于”check”的字符数据。

  1. <!ATTLIST payment type CDATA "check">

XML 实例:

在CDATA标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记。例如:

  1. <name><first>Bill</first><last>Gates</last></name>

而解析器会把它分解为像这样的子元素:

  1. <name>
  2. <first>Bill</first>
  3. <last>Gates</last>
  4. </name>

转义字符:

非法的xml字符必须被替换为实体引用(entity reference)。如果在XML文档中使用类似”< ” 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该象下面那样书写代码:

  1. <message>if salary < 1000 then</message>

为了避免出现这种情况,必须将字符”< ” 转换成实体,象下面这样:

  1. <message>if salary < 1000 then</message>

在 XML 中有 5 个预定义的实体引用:

  1. < < 小于号
  2. > > 大于号
  3. & & 与(和)号
  4. ' ' 单引号
  5. " " 双引号

注释:严格地讲,在 XML 中仅有字符 “<”和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

PS:有关如何使用webservice + xml协议开发接口,随后我会继续给出一篇开发指南。

发表评论

表情:
评论列表 (有 0 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CDATA[XXX]]的作用

    了防止XML的文本被解析器解析,XML会对它们进行转义,只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。非法字符如下: <table> ...

    相关 mybatis中![CDATA[ ]]语法介绍

    记录一下今天遇到的问题:在mybatis的xml文件中需要写一些特殊字符 如 > < & 这些字符在xml解析的时候会被转义,但是我们不希望它被转义,这时候就可以使用<!\[C

    相关 XStream支持CDATA标签

    需求: 在生成XML文档中需要支持CDATA标签,而且不是所字段都需要增加,只需要某些特定的字段增加CDATA的标签。  研究: 在网上找了一些相关资料,基本采用的方

    相关 mybatis中!CDATA的作用

    在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<!\[C