XML文件如何去除空行 Java Transformer输出格式设置

夏晨同学_6953

夏晨同学_6953

2026-03-21

980人浏览

原创

java transformer默认保留xml空行,因其将换行缩进解析为text节点;解决方法是在transform前用xpath定位//text()[normalize-space()='']并清理空白节点,再调用normalize()合并。

xml文件如何去除空行 java transformer输出格式设置

Java Transformer 默认会把 XML 空行当内容节点输出

Transformer(比如 javax.xml.transform.Transformer)在序列化 DOM 或 Source 时,如果原始 XML 里有换行、缩进或纯空白文本节点(#text),它默认照单全收——哪怕你没显式写 setOutputProperty(OutputKeys.INDENT, "yes"),只要输入 DOM 含空行,输出就可能带空行。这不是 bug,是它忠实还原“字符数据”的行为。

常见错误现象:
DocumentBuilder 解析一个带缩进的 XML 文件后直接 transform,结果输出里出现大量空行;或者用 Transformer 把新构建的 DOM 写出,发现开头/标签间多了空行。

  • 根本原因:DOM 中的换行符被解析为 Text 节点,而 Transformer 不会自动过滤它们
  • 解决方向不是改 OutputKeys,而是清理 DOM 树本身
  • 别指望 OutputKeys.INDENTOutputKeys.STANDALONE 能删空行——它们只控制格式化逻辑,不清理内容

用 XPath + Node.normalize() 清理空白文本节点最稳妥

DOM 提供了原生方式:遍历所有 Text 节点,判断是否只含空白(\s*),再调用 Node.normalize() 合并相邻文本节点,最后移除纯空白节点。比正则替换 XML 字符串安全,不破坏结构。

实操建议:

  • 在调用 transform() 前,对 Document 执行一次清理:先 document.getDocumentElement().normalize(),再递归检查每个 Node
  • XPath 表达式 //text()[normalize-space()=''] 快速定位纯空白文本节点(注意:需设置 XPathConstants.NODESET
  • 避免用 node.getNodeValue().trim().isEmpty() 直接判断——某些场景下 getNodeValue() 返回 null
  • 清理后务必再调用一次 document.getDocumentElement().normalize(),确保合并残留的相邻空白节点

Transformer.setOutputProperty(OutputKeys.INDENT, "no") 没用,但可以关掉自动换行

OutputKeys.INDENT 的值设为 "no""false" 并不能删除已有空行,它只影响 Transformer 是否主动插入缩进和换行。真正起作用的是 OutputKeys.OMIT_XML_DECLARATIONOutputKeys.STANDALONE 这类开关型属性,但它们跟空行无关。

如果你发现输出开头多了一行(比如 XML 声明前有空行),那大概率是原始 StringInputStream 本身就带 BOM 或前置换行——检查输入源,而不是调参数。

  • transformer.setOutputProperty(OutputKeys.INDENT, "no") → 仅禁用自动缩进,不影响已有空白节点
  • transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "0") → Apache Xalan 特有,非标准,慎用
  • 想让输出紧凑(无换行无缩进),唯一可靠方式:清理 DOM + 设置 INDENT="no" + 确保输入源干净

用第三方库如 jsoup 处理简单 XML 时要小心命名空间

jsoup 本质是 HTML 解析器,对 XML 支持有限:它会把 <bar></bar> 当成普通标签,丢失命名空间信息;遇到 或处理 PI(处理指令)时也容易出错。所以仅推荐用于无命名空间、无 CDATA、结构极简的 XML(比如配置片段)。

如果真要用 jsoup 清空行:

  • 先用 Jsoup.parse(xmlString, "", Parser.xmlParser()) 强制走 XML 模式
  • 再用 doc.body().select("body *").forEach(el -> el.text(el.text())) 清空子文本——但这会吃掉所有文本内容,不可逆
  • 更安全的做法是:只用 jsoup 提取关键字段,再用标准 DOM 构建新文档,绕过原始空行

复杂 XML 别图省事,DOM + XPath 是唯一可控路径。空行问题看着小,但混在 CI 流水线或签名验签环节里,容易变成难复现的偶发差异。清理 DOM 是必须卡在 transform 前的那个动作,晚一步就白干。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

4959

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

509

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1638

6

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

2025.12.04

678

13

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

3844

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

4897

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2222

7

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1498

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2144

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133万人学习