1. 概述
在 Java 中处理 XML 的过程中,我们经常会构建一个 org.w3c.dom.Document
实例,并需要将其输出为文件以供其他系统消费。
本文将介绍如何使用 Java 标准库将 Document
对象写入到文件中,支持两种格式:紧凑型(单行)和美化输出(pretty-printed)。
2. 使用 Transformer 进行转换
2.1. 创建 Transformer
写入 XML 文件的核心类是 javax.xml.transform.Transformer
。我们通过 TransformerFactory
来创建它:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
⚠️ 注意:JVM 会根据系统属性
javax.xml.transform.TransformerFactory
来决定使用哪个实现类。如果不指定,默认会使用平台默认的实现。
✅ 从 Java 9 开始,推荐使用以下方式来获取内置默认实现:
TransformerFactory transformerFactory = TransformerFactory.newDefaultInstance();
有了工厂类后,就可以创建 Transformer 实例了:
Transformer transformer = transformerFactory.newTransformer();
2.2. 定义源与目标
Transformer 的工作方式是将一个 Source 转换为一个 Result。在这里,我们的源是 Document
,目标是文件流。
首先,创建源对象:
DOMSource source = new DOMSource(document);
✅ 提示:这个 source 不一定非得是整个文档,只要是一个结构完整的子树也可以。
接着,定义输出目标:
FileWriter writer = new FileWriter(new File(fileName));
StreamResult result = new StreamResult(writer);
🔍
StreamResult
支持多种输出形式,比如OutputStream
或Writer
。如果你只是想生成字符串而不是写入文件,可以用StringWriter
。
2.3. 执行转换并生成文件
最后一步就是执行转换操作:
transformer.transform(source, result);
这会生成如下内容(默认为单行):
<?xml version="1.0" encoding="UTF-8" standalone="no"?><Company><Department name="Sales">
<Employee name="John Smith"/><Employee name="Tim Dellor"/></Department></Company>
3. 自定义输出格式
我们可以设置一些输出属性来控制生成的 XML 格式。
3.1. 美化输出(Pretty Print)
默认输出是一整行,不利于阅读。可以通过设置 OutputKeys.INDENT
属性开启缩进美化:
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
⚠️ 注意:仅设置
INDENT
可能不会生效,还需要配合 Apache Xalan 的扩展属性indent-amount
才能真正缩进。
开启后输出效果如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Company>
<Department name="Sales">
<Employee name="John Smith"/>
<Employee name="Tim Dellor"/>
</Department>
</Company>
3.2. 忽略 XML 声明头
如果不想输出 <?xml ... ?>
声明行,可以设置:
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
此时输出结果为:
<Company>
<Department name="Sales">
<Employee name="John Smith"/>
<Employee name="Tim Dellor"/>
</Department>
</Company>
3.3. 其他常用输出属性
除了上面提到的两个常用属性外,还可以控制更多细节:
- 版本号:
OutputKeys.VERSION
,默认是"1.0"
- 编码格式:
OutputKeys.ENCODING
,默认是"utf-8"
- 是否独立文档:
OutputKeys.STANDALONE
- DTD 相关属性:如
OutputKeys.DOCTYPE_SYSTEM
、OutputKeys.DOCTYPE_PUBLIC
这些都可以通过 setOutputProperty()
方法进行设置。
4. 总结
在这篇文章中,我们学习了如何将 org.w3c.dom.Document
写入文件,并掌握了以下关键点:
✅ 如何创建 Transformer
并执行转换
✅ 如何美化输出 XML 内容
✅ 如何自定义 XML 声明和其他输出参数
对于日常开发中需要导出 XML 数据的场景,这套方法足够应付绝大多数需求,简单粗暴还可靠。