Java Transformer需通过setOutputProperties设置indent和encoding:启用缩进需设OutputKeys.INDENT为"yes"并可选配Xalan扩展indent-amount;编码由OutputKeys.ENCODING控制,须与输出目标匹配,如StreamResult+OutputStream生效,StringWriter则忽略。

Java 中的 Transformer(来自 javax.xml.transform)本身不直接提供 indent 或 encoding 属性的 setter 方法,这些设置需通过 OutputKeys 写入 transformer.setOutputProperties() 来控制。
设置缩进(indent)
启用缩进需要两步:开启缩进功能 + 指定缩进数量(可选)。注意:仅对支持格式化输出的 Result 类型(如 StreamResult 配合 OutputStream 或 Writer)生效,且底层 XSLT 处理器(如 Xalan)需支持。
- 设置
OutputKeys.INDENT为"yes" - 可选:用
"{http://xml.apache.org/xslt}indent-amount"设置缩进空格数(Xalan 扩展,非标准但常用)
示例:
transformer.setOutputProperties(Map.of(
OutputKeys.INDENT, "yes",
"{http://xml.apache.org/xslt}indent-amount", "2"
));
设置编码(encoding)
编码由 OutputKeys.ENCODING 控制,它影响输出字节流的字符编码和 XML 声明中的 encoding 属性值。
立即学习“Java免费学习笔记(深入)”;
- 必须与实际写入目标匹配:若用
StreamResult包装FileOutputStream,编码会用于字节转换;若包装StringWriter,该设置会被忽略(Writer 已确定编码) - 常见值:
"UTF-8"、"GBK"、"ISO-8859-1"
示例:
Properties props = new Properties(); props.setProperty(OutputKeys.ENCODING, "UTF-8"); props.setProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperties(props);
注意事项和常见问题
这些设置不是万能的,实际效果受多个因素影响:
- 缩进在默认
TransformerFactory(JDK 自带 Xalan)下通常有效;换成其他实现(如 Saxon)需查其文档,语法可能不同 - 若输入是 DOMSource 且节点已含空白文本,缩进可能被保留或干扰,建议先调用
document.normalizeDocument()或预处理 - 编码设置不会自动改变
OutputStream的行为——你仍需确保用对应编码打开文件(如Files.newOutputStream(path, StandardOpenOption.CREATE)不指定编码,应配合OutputStreamWriter显式指定)
完整小例子(带缩进和 UTF-8)
生成格式化、UTF-8 编码的 XML 字符串:
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperties(Map.of(
OutputKeys.METHOD, "xml",
OutputKeys.ENCODING, "UTF-8",
OutputKeys.INDENT, "yes",
"{http://xml.apache.org/xslt}indent-amount", "4"
));
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
String xml = writer.toString(); // 此时含缩进和 UTF-8 声明
基本上就这些。关键记住:属性靠 setOutputProperties 设,不是调方法;缩进和编码都依赖底层实现和输出目标类型,实测比理论更可靠。










