在Java开发中,使用DOM(Document Object Model)解析器生成XML文件是常见操作,但默认生成的XML所有内容会连续排列在同一行,没有换行和缩进结构,查看和修改时十分不便。要实现XML的换行美化,核心是通过设置Transformer的输出属性来完成。

Java DOM生成XML的基础流程
使用DOM生成XML通常包含几个固定步骤:首先创建DocumentBuilderFactory实例,再通过它获取DocumentBuilder,接着创建空的Document对象,之后在Document中逐步添加根节点、子节点、属性等内容,最后将Document对象输出为XML文件。
如果不做任何格式调整,输出的XML会失去层级结构,比如下面的基础生成代码:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XmlGenerateDemo {
public static void main(String[] args) throws Exception {
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获取DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建空Document
Document document = builder.newDocument();
// 添加根节点
Element root = document.createElement("user");
document.appendChild(root);
// 添加子节点
Element name = document.createElement("name");
name.setTextContent("张三");
root.appendChild(name);
Element age = document.createElement("age");
age.setTextContent("25");
root.appendChild(age);
// 输出XML
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult("user.xml");
transformer.transform(source, result);
}
}
这段代码生成的user.xml内容会是<user><name>张三</name><age>25</age></user>,所有内容挤在一行。
使用OutputKeys.INDENT实现换行美化
要实现XML的换行和缩进,需要在Transformer输出前设置输出属性,核心就是OutputKeys类的INDENT属性。OutputKeys是Java XML转换中用于定义输出格式的常量类,INDENT属性用于开启缩进功能。
具体设置步骤
- 获取Transformer实例后,调用
setOutputProperty方法设置OutputKeys.INDENT为"yes",开启缩进开关 - 如果需要调整缩进的空格数量,可以额外设置
OutputKeys.INDENT_AMOUNT属性,值为数字字符串,比如"4"表示每次缩进4个空格
修改后的完整代码示例如下:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XmlPrettyGenerateDemo {
public static void main(String[] args) throws Exception {
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获取DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建空Document
Document document = builder.newDocument();
// 添加根节点
Element root = document.createElement("user");
document.appendChild(root);
// 添加子节点
Element name = document.createElement("name");
name.setTextContent("张三");
root.appendChild(name);
Element age = document.createElement("age");
age.setTextContent("25");
root.appendChild(age);
// 添加子节点下的子节点
Element address = document.createElement("address");
Element city = document.createElement("city");
city.setTextContent("北京");
address.appendChild(city);
root.appendChild(address);
// 获取Transformer并设置输出属性
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// 开启缩进功能
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// 设置缩进空格数为4,可根据需求调整
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
// 输出XML
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult("pretty_user.xml");
transformer.transform(source, result);
}
}
运行上述代码后,生成的pretty_user.xml内容会带有换行和缩进,格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>张三</name>
<age>25</age>
<address>
<city>北京</city>
</address>
</user>
注意事项
- 部分Transformer实现中,仅设置
OutputKeys.INDENT为"yes"可能缩进不生效,需要额外设置indent-amount属性,上述代码中的{http://xml.apache.org/xslt}indent-amount是Apache Xalan Transformer的扩展属性,适配性较好 - 如果不需要输出XML声明(<?xml version="1.0" encoding="UTF-8"?>),可以设置
OutputKeys.OMIT_XML_DECLARATION为"yes" - 设置的缩进空格数不会影响XML的实际内容,仅改变输出时的格式,对XML的解析没有任何影响
常见问题解答
设置INDENT后还是没有换行怎么办
首先检查是否正确调用了setOutputProperty方法,其次确认是否设置了缩进数量的扩展属性,不同XML解析器的默认缩进行为可能存在差异,添加扩展属性后通常可以解决。
缩进空格数可以自定义吗
可以,通过indent-amount属性设置对应的数字即可,比如设置为"2"就是每次缩进2个空格,根据团队规范调整即可。
JavaDOMXMLOutputKeys_INDENT修改时间:2026-06-21 09:12:33