Java的Transformer怎么设置输出属性(indent, encoding)

10次阅读

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

Java的Transformer怎么设置输出属性(indent, encoding)

Java 中的 transformer(来自 javax.xml.transform)本身不直接提供 indentencoding 属性的 setter 方法,这些设置需通过 OutputKeys 写入 transformer.setOutputProperties() 来控制。

设置缩进(indent)

启用缩进需要两步:开启缩进功能 + 指定缩进数量(可选)。注意:仅对支持格式化输出Result 类型(如 StreamResult 配合 OutputStreamWriter)生效,且底层 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 设,不是调方法;缩进和编码都依赖底层实现和输出目标类型,实测比理论更可靠。

text=ZqhQzanResources