org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。 的解决办法

本文针对MyBatisPlus在动态SQL拼接时出现的SAXParseException异常,提供了两种解决方案,一是使用OGNL标签包裹特殊符号,二是转换特殊符号为XML转义字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在基于微服务架构风格的项目开发过程中,为了提高快速开发的目的,提高开发效率,集成了 MyBatisPlus,对于 MyBatisPlus 封装的 CRUD API 接口已经非常强大了,但是有时还是需要使用其动态 SQL 的拼接,在单个模块开发完成后,启动测试时遇到了个梗,异常信息“ Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。

具体的错误信息如下:

Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 57; columnNumber: 24; 元素内容必须由格式正确的字符数据或标记组成。
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:259)
	at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:125)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.<init>(XMLMapperBuilder.java:78)
	at com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean.buildSqlSessionFactory(MybatisSqlSessionFactoryBean.java:581)
	... 81 common frames omitted
Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.startOfMarkup(XMLDocumentFragmentScannerImpl.java:2636)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2734)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348)
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:257)
	... 84 common frames omitted

Disconnected from the target VM, address: '127.0.0.1:54640', transport: 'socket'

Process finished with exit code 1

部分截图如下图:

 

解决办法

各种摸索,各种尝试,最后总结出来两种解决办法,在这儿记录一下(为什么网上有了我还要写呢,我浏览了一下,所有都是XJBG的,最早的一篇关于这个问题的解释是出现在2015年,而后都是清一色的一样一样的。。。)

在这儿所有的看到这篇文章的老铁们,注意咯,MyBatis 在编写动态SQL的时候,是基于OGNL的,只要记住这一点,你就一定不会错了,至于什么 OGNL,OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,OGNL为什么这么受欢迎呢,原因很简单,它相对其它表达式语言具有下面几大优势:

1、基本对象树的访问;

2、对容器变量的访问;

3、使用操作符号;

4、容器、数组、对象;

5、对静态方法或变量的访问;

6、方法调用;

7、投影和选择;

 

1、不改变符号,依然使用 “ > ” 或者 “ < ” ,则需要使用 OGNL 标签,将该符号包起来,可以是包裹单个符号,也可以将整句包裹寄来,示例SQL如下:

<select id="getLoginLogByPage" resultType="com.mcp.entity.LoginLog">
	SELECT l.id, l.job_number, l.name, l.createDate, l.ip_addr
		, l.remark
	FROM loginlog l
	<where>
		<if test="jobNumber != null" >
			<![CDATA[ and l.job_number > #{jobNumber}]]>
		</if>
	</where>
	GROUP BY l.today_date, l.ip_address;
 
</select>

 

2、使用 OGNL 语法表达式,在 OGNL 语法表达式中不能直接写符号,需要要使用其转义后的字符,对应如下:

符号转义字符说明
<&lt;小于
<=&lt;=小于等于
>&gt;大于
>=&gt;=大于等于
&&amp;逻辑与
'xxx'&apos;单引号
"xxx"&quot;双引号

示例 SQL:

<select id="getLoginLogByPage" resultType="com.mcp.entity.LoginLog">
	SELECT l.id, l.job_number, l.name, l.createDate, l.ip_addr
		, l.remark
	FROM loginlog l
	<where>
		<if test="jobNumber != null" >
			and l.job_number &gt; #{jobNumber}
		</if>
	</where>
	GROUP BY l.today_date, l.ip_address;
 
</select>

 

就可以正常的启动了,如下图:

 

 

 

 


 好了,关于 org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。  的解决办法  就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:CSDN (Chinese Software Developer Network)
原        文:https://blog.csdn.net/Hello_World_QWP/article/details/86513179
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值