outputformat.createprettyprint() 没生效是因为它仅创建格式配置,不自动触发美化;必须将其传入 xmlwriter 构造函数并用其 write() 方法输出,否则 document.asxml() 等方法会忽略该配置。

为什么 OutputFormat.createPrettyPrint() 没生效?
常见现象是调用后 XML 仍挤在一行,缩进和换行全无。根本原因不是方法错了,而是它只设置格式策略,不自动触发格式化——必须显式传给 XMLWriter 或 DOMWriter 才起作用。
-
OutputFormat是个配置对象,本身不操作 XML 树或流 - 漏掉
new XMLWriter(outputStream, format)这一步,等于只写了菜谱没下锅 - 如果用了
Document.asXML(),它完全忽略你配的OutputFormat,只走默认紧凑模式
怎么让 XMLWriter 正确用上美化格式
核心是确保写入路径经过 XMLWriter 实例,且该实例初始化时绑定了 OutputFormat。别用 Document.toString() 或 asXML() 替代。
- 输出到文件:用
FileOutputStream+XMLWriter,别直接写字符串 - 输出到字符串:用
StringWriter包裹XMLWriter,再取toString() - 注意字符编码:
OutputFormat默认用 UTF-8,但StringWriter不带编码,实际写文件时建议显式指定OutputStreamWriter
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
StringWriter writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(document);
String prettyXml = writer.toString(); // 这才是带缩进的结果
createPrettyPrint() 和手动 new OutputFormat 的区别
前者是快捷方式,后者可精细控制。多数情况用前者够用,但遇到换行符、缩进空格、是否加 XML 声明等需求,就得手动设。
-
createPrettyPrint()默认缩进 4 空格、启用换行、保留 XML 声明 - 想缩进 2 空格?改
format.setIndent(" ") - 不想输出
<?xml version="1.0" encoding="UTF-8"?>?调format.setSuppressDeclaration(true) - Windows 下换行异常(显示为
)?设
format.setNewlines(true)并确保输出流支持 CRLF
Dom4j 1.6.1+ 的兼容性坑
新版 Dom4j 对 OutputFormat 的部分 setter 做了行为调整,尤其在处理 CDATA 和特殊字符时。
立即学习“Java免费学习笔记(深入)”;
-
format.setExpandEmptyElements(true)在 1.6.1 后默认为false,导致<tag></tag>不展开成<tag></tag>,美化效果打折扣 - 如果 XML 含中文且输出乱码,不是编码设错了,而是
XMLWriter构造时没把OutputFormat的 encoding 透传到底层流——务必检查OutputStreamWriter是否也指定了 UTF-8 - 避免混用不同 Dom4j 版本的 jar:旧版
createPrettyPrint()返回OutputFormat,新版可能返回子类,反射调用易失败
XMLWriter,就永远只是个摆设。










