概述
MyBatis XML 文件解析错误分析与解决方案
报错信息:
org.apache.ibatis.builder.BuilderException: Error creating document instance.
Cause: org.xml.sax.SAXParseException;
lineNumber: 1403; columnNumber: 65;
The content of elements must consist of well-formed character data or markup.
问题定位
需要检查 XXXMapper.xml 文件第 1403 行第 65 列附近的代码,确认是否存在 XML 语法错误。
常见原因及解决方案
1. XML 特殊字符未转义
问题描述:
SQL 语句中包含 XML 特殊字符(如 <, >, & 等),但未正确转义。
解决方案:
-
将特殊字符转义为实体引用:
<!-- 错误示例 -->
WHERE create_time < #{endTime}
<!-- 正确示例 -->
WHERE create_time < #{endTime}
-
必须转义的字符:
-
<→< -
>→> -
&→& -
"→" -
'→'
-
2. CDATA 区域使用不当
问题描述:
SQL 中包含大量特殊字符或复杂表达式时,未使用 CDATA 包裹。
解决方案:
-
使用
<![CDATA[ ]]>包裹包含特殊字符的 SQL:
<select id="example">
<![CDATA[
SELECT * FROM table
WHERE column1 < 100
AND column2 > #{value}
]]>
</select>
-
注意:CDATA 区域内不能包含
]]>,否则会提前终止。
3. 动态 SQL 标签问题
问题描述:
-
动态 SQL 标签(如
<if>,<foreach>)未正确闭合 -
标签嵌套错误
解决方案:
-
检查所有动态标签是否配对闭合:
<!-- 错误示例 -->
<if test="condition">
AND status = 1
<!-- 正确示例 -->
<if test="condition">
AND status = 1
</if>
-
使用 IDE 的 XML 验证功能检查标签嵌套。
4. SQL 注释格式错误
问题描述:
使用了非 XML 标准的注释格式(如 SQL 的 --)。
解决方案:
-
仅使用 XML 标准注释:
<!-- 正确示例 -->
<!-- 这里是注释 -->
<!-- 错误示例 -->
-- 这里是注释
5. 文件编码问题
问题描述:
XML 文件使用了非 UTF-8 编码,导致特殊字符解析异常。
解决方案:
-
确保文件保存为 UTF-8 编码(无 BOM)
-
在文件头部明确定义编码:
<?xml version="1.0" encoding="UTF-8"?>
排查步骤
-
定位问题代码
打开XXXMapper.xml,直接跳转到第 1403 行附近。 -
检查上下文
-
查看第 1403 行第 65 列附近的 SQL 语句
-
检查前后 10 行代码的完整性
-
-
验证修复
-
临时注释可疑代码段,确认是否能通过编译
-
使用 XML 验证工具检查文件有效性
-
-
预防措施
-
在 IDE 中安装 XML 插件(如 Eclipse 的 XML Editor)
-
启用实时 XML 语法检查
-
典型错误示例与修复
错误案例 1:未转义比较运算符
<!-- 错误代码 -->
<where>
create_time > #{startTime} AND create_time < #{endTime}
</where>
<!-- 修复后 -->
<where>
create_time > #{startTime} AND create_time < #{endTime}
</where>
错误案例 2:CDATA 使用不当
<!-- 错误代码 -->
SELECT * FROM table WHERE value < 100
<!-- 修复后 -->
<![CDATA[
SELECT * FROM table WHERE value < 100
]]>
扩展建议
-
MyBatis 最佳实践
-
复杂 SQL 建议全部使用 CDATA 包裹
-
优先使用
<等转义符而非 CDATA(更易维护)
-
-
工具推荐
-
XML 格式化工具:XML Notepad 2007
-
在线验证:Validate XML files
-
-
团队规范
-
在项目 README 中注明 XML 文件编写规范
-
代码审查时检查 SQL 转义情况
-
通过以上系统化的分析和解决方案,可以有效解决 MyBatis XML 文件解析错误问题,同时预防类似错误的发生。

1355

被折叠的 条评论
为什么被折叠?



