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

问题描述

在基于微服务架构风格的项目开发过程中,为了提高快速开发的目的,提高开发效率,集成了 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.(XPathParser.java:125)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.(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

部分截图如下图:

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

 

解决办法

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

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

1、基本对象树的访问;

2、对容器变量的访问;

3、使用操作符号;

4、容器、数组、对象;

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

6、方法调用;

7、投影和选择;

 

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

 

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

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

示例 SQL:

 

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

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

 

 

 

 


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


作       者: 华    仔
联系作者: [email protected]
来        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/86513179
版权声明: 本文为博主原创文章,请在转载时务必注明博文出处!

你可能感兴趣的:(MyBatisPlus)