码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • dom4j读取xml内容时丢失换行符


    文章目录

    • (一)现象
    • (二)分析
    • (三)解决
    • (四)总结

    (一)现象

    很偶然的发现,很普通的SQL语句,在我们自己的Java程序中执行出错。
    但是在数据库工具中执行正常,类似如下:

    select '','','
    ','' -- test the datetime ,sysdate,systimestamp from dual
    • 1
    • 2

    看日志,我们执行的语句变成了:

    select '2022','09','14','257' -- test the datetime ,sysdate,systimestamp from dual 
    
    • 1

    由于多行变单行,所以注释掉了后续所有内容,导致报错:

    业务处理错误: ORA-00923: FROM keyword not found where expected

    (二)分析

    这段SQL语句是保存在XML当中的,检查原始XML内容发现换行是存在的:
    换行也是明显存在的。

    ......
    <Task FileQ="XXX" SQL="select xxx,yyy,zzz -- test the datetime
    ,sysdate,systimestamp from dual" CHK="1" />
    ......
    
    • 1
    • 2
    • 3
    • 4

    但是dom4j(org.w3c.dom也一样)读出来SAXReader.read()的时候呢,
    数据内容中的换行就已经被替换成空格了。

    研究了一阵,得到的结论是,Java并没有错……
    因为XML格式,数据内容中的回车换行\r \n,应该使用转义字符 。
    也就是说,上面那段XML,应该保存成如下格式:

    ......
    <Task FileQ="XXX" SQL="select xxx,yyy,zzz -- test the datetime
    ,sysdate,systimestamp from dual" CHK="1" />
    ......
    
    • 1
    • 2
    • 3

    (三)解决

    只需要保存XML时使用转义字符就可以了。
    Java程序在执行SQL时就可以读取到多行,第一行末的注释,也不会再影响后续行了。

    正常情况下,这里就完结了。

    ⭕️

    ……

    可是我们的Windows下的配置界面不是Web页面,也不是Java程序。
    读写XML部分使用的是 🔗OmniXML。

    测试了一下,OmniXML读取转义/非转义的换行符都正常。
    但是它保存换行符时,似乎只能非转义,也就是直接存,没有参数选项……

    幸好有源代码。

    检查源文件,找到转换转义字符的代码:

        case Ord(Value[iValue]) of
          34: Store('"');
          38: Store('&');
          39: Store(''');
          60: Store('<');
          62: Store('>');
        else
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加回车换行的转义字符13 10,也就是\r \n(Pascal并不这样写)。

        case Ord(Value[iValue]) of
          10: Store('
    ');
          13: Store('
');
          34: Store('"');
          38: Store('&');
          39: Store(''');
          60: Store('<');
          62: Store('>');
        else
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (四)总结

    这是 不同语言 / 不同时代 的程序模块,配合时出现的问题。

    我们应该遵守规范:🔗 XML格式标准。
    但现实中我们无法完全控制输入的内容格式。

    所以Java如果在XML读写上,给个选项(是否兼容原始未转义\r \n)才能完全解决。

  • 相关阅读:
    Python itertools模块中的combinations() 函数用法
    尚硅谷大数据数仓项目superset db upgrade三个报错解答
    亚马逊、ozon、美客多等平台的测评技术核心:提升跨境电商业绩的关键要素
    经典案例|使用Supabase解决可视化大屏项目的常见问题
    无法访问mybatis.dto.StudengInVO-使用maven编译报错
    Linux友人帐之命令
    ocr、人工智能、文字识别接口
    可视化工具Visdom的使用
    net-java-php-python-新华眼镜ERP系统计算机毕业设计程序
    智能语音外呼系统 OKCC没有电脑的坐席能不能开展工作
  • 原文地址:https://blog.csdn.net/ddrfan/article/details/126902446
  • 最新文章
  • 花29块让AI帮我写代码:一个测试工程师的Hermes使用体验
    Ubuntu 24.04 安装企业微信(deepin-wine 版)完整指南
    DeepSeek-Lane:在 Cursor 内使用 DeepSeek V4 模型
    OpenHarmony.NET 停更事件复盘和思考
    用 AI Agent 做面试准备和面试复盘:我写了一个Skill,把多轮面试当成系统来打
    你的前端代码打包后究竟经历了什么?
    开多个 Agent 后 Claude Code 账单翻了 4 倍,一个配置解决了
    Kubernetes Gateway API 完全指南
    IntelliJ IDEA 无法识别 Maven SNAPSHOT 依赖,但 Maven 编译正常
    C# 基础入门指南:从零开始学习 C# 编程
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号