在xml中特殊符号处理<![CDATA[ ]]>

原创
2023/11/08 15:06
阅读数 233

在xml中,不能存在如下的特殊字符:

大于等于符号:>=

小于等于符号:<=

不等于符号:<>

大于符号:>

小于符号:<

且符号:&

英文双引号符号:"

英文单引号符号:'

如果xml中需要写入特殊符号,则需要添加<![CDATA[]]>。

2. 概述<![CDATA[ ]]>

上文提到了<![CDATA[]]>,那么,我就简要概述它。

被<![CDATA[]]>这个标记,所包含的内容将表示为纯文本,比如<![CDATA[ < ]]>表示文本内容"<"。

平时在mybatis的映射文件写sql时,很多时候都需要写一些特殊的字符。例如:<字符、>字符、>=字符、<=字符,但是在xml文件中并不能直接写上述列举的字符,否则就会报错。

因为在解析xml文件时,我们如果书写了特殊字符,在没有特殊处理的情况下。

这些字符会被转义,但我们并不希望它被转义,所以我们要使用<![CDATA[ ]]>来解决。

那为什么要这样书写呢?<![CDATA[ ]]>是XML语法,在CDATA内部的所有内容都会被解析器忽略。

所以,当我们在xml文本中包含了很多的<、<= 和 &字符,就像程序代码一样,那么最好把他们都放到CDATA部件中。

3. 书写规范
需要注意的问题就是,在我们的mybatis的映射文件中,以下<where>、<select> 等这些标签都不会被解析,所以,我们只把有特殊字符的语句放在<![CDATA[ ]]>中,尽量缩小<![CDATA[ ]]>的范围。

因而,我在上文的sql语句中,存在不等于符号(<>),那么,我可以进行如下修改:
<select id="queryByUsernameAndId" resultType="com.test.entity.po.User">
    SELECT 
        * 
    FROM 
        `user`
    <where>
        username = #{username}
        AND id <![CDATA[ <> ]]> #{userId}
        and deleted = 0
        and user_status = 1 LIMIT 1
    </where>
</select>

4. 文末总结

不管怎么样,转义前的字符也好,转义后的字符也好,都会被xml解析器解析。

为了方便起见,使用<![CDATA[]]>来包含不被xml解析器解析的内容。

但要注意的是:

此部分不能再包含]]>

不允许嵌套使用

]]>这部分不能包含空格或者换行。

最后,说说<![CDATA[]]>和xml转移字符的关系,它们两个看起来是不是感觉功能重复了?
  
是的,它们的功能就是一样的,只是应用场景和需求有些不同:

<![CDATA[]]>不能适用所有情况,转义字符可以

对于短字符串<![CDATA[]]>写起来啰嗦,对于长字符串转义字符写起来可读性差;

<![CDATA[]]>表示xml解析器忽略解析,所以更快。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部