Java中让JAXB输出格式化XML,关键在于设置Marshaller.JAXB_FORMATTED_OUTPUT为true;启用后自动添加两空格缩进和换行,但不可配置缩进符类型或宽度。

Java中让JAXB输出格式化(带缩进)的XML,关键在于配置Marshaller的Marshaller.JAXB_FORMATTED_OUTPUT属性为true。
启用格式化输出
在调用marshal()之前,设置格式化开关即可:
- 获取
Marshaller实例后,调用setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true) - 该属性值必须是
Boolean.TRUE或true(推荐用true,更简洁) - 不设置或设为
false时,默认输出为单行无缩进XML
完整示例代码
以下是最小可运行示例:
Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 可选:指定编码,避免乱码 marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); marshaller.marshal(obj, System.out); // 输出到控制台,带缩进
若输出到文件,可传入FileOutputStream或FileWriter,格式化效果同样生效。
立即学习“Java免费学习笔记(深入)”;
注意换行与缩进行为
JAXB内置的格式化仅添加基本缩进和换行,但有几点限制:
- 缩进默认使用两个空格(不可直接配置为Tab或4空格)
- 不会在XML声明后额外空一行(如
\n),这是正常行为 - 对空元素(如
)不展开为,格式化不影响元素语法
替代方案:使用Transformer(如需精细控制)
如果需要自定义缩进宽度、添加DOCTYPE、或处理特殊字符转义,可结合Transformer:
- 先用JAXB marshal为
DOMSource或字符串 - 再用
TransformerFactory创建Transformer,设置OutputKeys.INDENT和"{http://xml.apache.org/xslt}indent-amount" - 这种方式更灵活,但多一步转换,一般场景无需










