java中将dom对象写入输出流需用jaxp的transformer:先通过transformerfactory创建transformer,设置缩进、编码等输出属性,再用domsource和streamresult执行transform。

Java中把DOM对象写入输出流,核心是用 Transformer(来自JAXP)将 Document 转成XML字符串或直接序列化到输出流。
使用TransformerFactory生成Transformer
这是标准、推荐的方式,支持格式化、编码控制和自定义输出属性:
- 获取
TransformerFactory实例(线程不安全,建议每次创建或复用单例) - 调用
newTransformer()得到默认转换器,或传入StreamSource加载XSL样式表 - 设置输出属性,如缩进(
OutputKeys.INDENT)、编码(OutputKeys.ENCODING)、版本等
把DOM Document写入文件输出流
示例:将 Document 写入 FileOutputStream(自动处理编码与换行):
Document doc = ...; // 已构建好的DOM文档
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
try (FileOutputStream fos = new FileOutputStream("output.xml")) {
t.transform(new DOMSource(doc), new StreamResult(fos));
}
写入其他输出流(如ByteArrayOutputStream、ServletOutputStream)
只需替换 StreamResult 的目标即可,例如写入字节数组便于后续传输或测试:
立即学习“Java免费学习笔记(深入)”;
- 用
ByteArrayOutputStream获取XML字节,再转为String或发送网络 - 在Web应用中,可直接用
response.getOutputStream()作为目标流 - 注意:若输出流已设响应头(如
Content-Type: application/xml;charset=UTF-8),需确保编码一致
注意事项与常见问题
避免踩坑的关键点:
- DOM树必须有且仅有一个根节点;否则
transform会抛TransformerException - 中文乱码?检查
OutputKeys.ENCODING和实际输出流是否匹配(如写入文件时,FileOutputStream本身不处理编码,靠Transformer写入字节) - 不需要缩进?去掉
INDENT属性,或设为"no";默认不缩进 - 想忽略XML声明?设置
OutputKeys.OMIT_XML_DECLARATION为"yes"
基本上就这些。不用额外依赖,JDK内置的javax.xml.transform 就够用了。










