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 支持多种输出形式,比如 OutputStreamWriter。如果你只是想生成字符串而不是写入文件,可以用 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_SYSTEMOutputKeys.DOCTYPE_PUBLIC

这些都可以通过 setOutputProperty() 方法进行设置。

4. 总结

在这篇文章中,我们学习了如何将 org.w3c.dom.Document 写入文件,并掌握了以下关键点:

✅ 如何创建 Transformer 并执行转换
✅ 如何美化输出 XML 内容
✅ 如何自定义 XML 声明和其他输出参数

对于日常开发中需要导出 XML 数据的场景,这套方法足够应付绝大多数需求,简单粗暴还可靠。


原始标题:Write an org.w3.dom.Document to a File | Baeldung