一、问题描述:
首先,在XML中写下如下标签<sql></sql>,其中包含一个SQL ,SQL中含有小于号"<" 。
<sql>select * from t1 where dt < 1</sql>
然后提示错误信息:The content of elements must consist of well-formed character data or markup.
二、原因:
XML CDATA使用说明中说:“所有 XML 文档中的文本均会被解析器解析。只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。”
因此,XML默认会将"where dt < 1" 中的"<"解析成标签的一部分(解析器会把它解释为新元素的开始),被认为是不完整的标签,提示错误。
三、解决方法:
1.将非法的 XML 字符替换为实体引用。
<sql>select * from t1 where dt < 1</sql>
(XML 中的 5 个预定义的实体引用,如下表)
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ’ | 单引号 |
" | " | 双引号 |
2. 使用CDATA区段。"<![CDATA[]]>"
<sql>
<![CDATA[
select * from t1 where dt < 1
]]>
</sql>
使用CDATA的注意事项:
CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。
注:在使用Java或Python对XML解析时,标签中增加的CDATA不影响解析代码。