xml
<delete id="deleteBeforeDate">
DELETE FROM record
WHERE operate_time
<
#{date}
</delete>
-
在 Spring Boot 项目中,使用 MyBatis PostgreSQL,上述 SQL 语句 XML 解析错误,出现如下错误信息
Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1465)...
问题原因
-
这个错误信息表示在 XML 中使用了特殊字符而没有正确转义
-
其中,小于号
<在 XML 中属于特殊字符,需要转义
处理策略
- 将
<替换为 XML 转义字符<
xml
<delete id="deleteBeforeDate">
DELETE
FROM record
WHERE operate_time < #{date}
</delete>
- 或者,使用
<![CDATA[]]>来包裹包含特殊字符的内容,更清晰,更推荐使用
xml
<delete id="deleteBeforeDate">
<![CDATA[
DELETE
FROM record
WHERE operate_time < #{date}
]]>
</delete>