使用mybatis框架会在xml中写sql语句,如果sql中用到一些特殊字符的话(如直接使用:"<","&"...),XML 解析将会出现错误。
1、为什么会错误?
2、怎么避免直接使用特殊字符报错?
答1:之所以会报错是因为:
XML 解析器通常情况下会解析XML文档中的所有文本。
当某个XML元素被解析的时候,XML标签之间的文本也会被解析:
例1:user.xml:
//select标签里边文本1会被解析,isNotEmpty 标签里边文本2会被解析,isNotNull 标签里边文本3会被解析
解析器之所以这么做是因为 XML 元素可包含其他元素,就像上边这个例子中,其中的
而解析器会把它分解为下边这样的子元素:
//select标签里边文本1会被解析,isNotEmpty 标签里边文本2会被解析,isNotNull 标签里边文本3会被解析
假如在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生错误,这是因为解析器会把它解释为新元素的开始。因此类似下边查询条件直接设置为 age<10 ,这种写法会报错:
答2:为了避免直接使用特殊字符报错:
正确写法:
方法1、使用转义字符转义成符号对应的实体:< (“;”后边封号必须加)相当于小于号 “<”:
如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。为了避免出现这种情况,不合法的XML字符必须被替换为相应的实体。所以必须将字符"<" 转换成实体 "<" 。
注意:
1、实体必须以符号"&"开头,以符号";"结尾。
2、转义序列字符之间不能有空格。
3、区分大小写。
在 XML 中有 5 个转义字符分别代表对应的符号(实体):
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 省略号 |
" | " | 引号 |
严格的讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是写的时候直接都使用转义字符是个好的习惯,至少能避免出现其他问题。
但是不管转义前的字符也好,还是转义后的字符也好,都会被xml解析器解析;为了方便起见,使用输入文本]]>来包含不被xml解析器解析的内容。
方法2、语法格式:
< ! [ CDATA [忽略检查的文本:骗过xml解析器,不解析这里边的内容或者只是把这里边内容当成了普通文本]]>
什么是CDATA?
CDATA全名为character data,指不使用XML解析器解析的文本数据。在标记CDATA下,所有与XML规范冲突的关键字字符串都被XML处理程序一视同仁地当做字符数据看待,CDATA的形式如下:
1、格式:
2、其中文本内容中不能出现字符串“]]>”,另外CDATA不能嵌套。
3、 CDATA区域是由“”为结束标记,注意CDATA为大写。
4、”]]>”这部分不能包含空格或者换行。