解析异常SAXParseExceptionis如何处理
创始人
2024-02-27 06:43:27
0


1.问题背景

今天一位同事找我寻求帮助,售后向他反馈的问题不知道如何排查,他尝试分析服务器端日志文件, 但是日志文件中并没有报错信息,查询源码时候发现,报错信息被try...catch处理

2.排查过程

顺便提一句, 排查问题时候需要记住一句话:“相信日志, 相信数据、相信代码, 不要相信售后的嘴”。

没有报错日志,那么就先分析源码。 通过现有业务功能和日志文件中仅有的操作日志, 定位问题在某个订单处理过程中,我们发现只有某个客户存在问题,其他客户正常,断定是数据问题,因此我尝试了解订单数据,以便了解客户办理的业务信息,在这个过程中发现了可疑点。 

订单的详情内容XML 以CLOB方式存储, 在PLSQL中查看CLOB对象的时候, 发现存在错误提示,从信息看解析字符串异常


Error: 无效的 unicode 字符。
Line: (93)
Text: 
File:

查看订单内容信息,发现订单详情中缺失存在,remak是用来记录一些备注信息,

          0falsefalse0falsefalse0148400000006816211

订单的详情内容在Oracle数据库中以CLOB方式存储。 什么时候CLOB呢?Oracle 存储字符串一般使用VARCHAR2 变量类型,当大于其最大字节长度时候(网络上很多人说最大字节长度为32767),需要使用大数据类型来存储,也可以叫大对象类型( Large Object)。CLOB类型的最大优势就是容量大,最多能容纳4GB的数据。 

了解这些信息后, 尝试重现问题, 测试环境中找了1条类似的记录,将订单的对应字段修改为"�" , 程序中取消try..catch处理,复现了现场问题, 查看日志发发现,日志中明确显示了XML中存在字符"�"  造成解析XML错误

Caused by: org.xml.sax.SAXParseException; lineNumber: 93; columnNumber: 24; Character reference "�" is an invalid XML character.at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:108)... 122 more

3.解决方法

因为字符解析引发的问题, 因此通过replace函数将问题字符串替换为可解析的字符串即可

Replace() 函数是用另外一个值来替代串中的某个值

  • 函数:replace()
  • 含义:替换字符串
  • 用法:replace(原字段,“原字段旧内容“,“原字段新内容“)

需要注意的是使用下面的SQL无法达到解决问题的效果

update orderinfo oset o.ordercontent = replace(o.ordercontent,"�", 'null')
where o.orderid = 61926418

字符 "�"中的&会被oracle当做变量来处理,例如下面的SQL执行结果如下

--测试
select '�' from dual;

执行结果: 

为了解决此问题就需要用到Oralce的转义操作,在SQL语句中通过chr(38) 来替换字符&,参考SQL

--测试
select chr(38)||'#x0;' from dual;

执行结果:

最终使用以下方式解决问题

update orderinfo oset o.ordercontent = replace(o.ordercontent, chr(38)||'#x0;', 'null')
where o.orderid = 61926418

4. 文章总结

通过本次问题处理需要记住以下几点

  1. 使用try..catch捕获异常,一定要打印日志,排查问题时才会更加顺利
  2. 大数据CLOB最大的优势为容量大,
  3. SQL 中可以使用chr(38) 来替换特殊字符 “&”


上一篇:Log4j2安全 JNDI漏洞 CVE-2021-44228

相关内容

热门资讯

债务逾期13亿元!因借款合同纠... 12月21日晚间,万通发展(SH 600246)发布公告称,公司控股股东嘉华东方控股(集团)有限公司...
大治一男子拦停轿车打砸!警方称... 近日,有网友发布视频称,湖北省大治市发生男子拦车打砸事件,并称起因系“男子带娃骑电动车遭汽车溅水”。...
宁波小洛熙事件:医学,咱不懂;... 文|庄志明律师 宁波小洛熙事件最近在网上被广泛热议,今天看新闻又涉及尸检报告,要求卫健委解释小洛熙尸...
北京律师行业年均免费为群众提供... 12月19日,北京市律师协会发布《北京市律师行业社会责任报告》,展示“十四五”时期北京律师行业在履行...
分居期间男子与公司女员工不正当... 公司股东李某乙在与妻子李某甲分居期间,与公司女员工马某某存在不正当交往并育有子女,还向其大额转账。李...
男子带作弊设备考科目一,被考官... 花钱就能够通过科目一考试,前不久,一名男子轻信朋友考试“包过”承诺,带着隐蔽的作弊设备进入考场,没想...
一个月内收两封监管函,瑞茂通怎... 12月19日,瑞茂通(600180)公告,于2025年12月19日收到监管工作函,监管机构就公司信息...
律师的作用 我以前自己打官司都是当被告,想办法不让对方讹诈就行,感觉律师没啥用,只是在法庭替你发言而已,孩子谢浩...
120多万卡宴只卖60万!海南... 12月20日,话题#海南封关120多万卡宴只要60万#冲上热搜,引发公众热议。 据媒体报道,12月1...