在Java开发中,处理XML数据是常见需求,生成或者解析XML后,原始的XML字符串往往没有换行和缩进,可读性很差,这时候就需要对XML字符串进行格式化输出,让结构更清晰。

使用JDK自带的Transformer类格式化XML
JDK自带的javax.xml.transform包下的类可以直接实现XML格式化,不需要引入额外的第三方依赖,适合对依赖有严格限制的项目。
实现步骤如下:
- 将XML字符串转换为
Document对象 - 创建
Transformer实例并设置输出属性,开启缩进和换行 - 将
Document转换回字符串输出
完整代码示例如下:
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 java.io.ByteArrayInputStream;
import java.io.StringWriter;
public class XmlFormatUtil {
public static String formatXmlWithJdk(String xmlStr) throws Exception {
// 解析XML字符串为Document对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
// 创建Transformer并设置格式化属性
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 设置输出编码
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 开启缩进
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// 设置缩进量,部分Transformer实现支持该属性
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
// 执行转换,输出到字符串
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
return writer.toString();
}
public static void main(String[] args) {
String rawXml = "<?xml version="1.0" encoding="UTF-8"?><user><id>1</id><name>张三</name><age>25</age></user>";
try {
String formattedXml = formatXmlWithJdk(rawXml);
System.out.println(formattedXml);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用dom4j库格式化XML
dom4j是常用的XML处理第三方库,提供了更简洁的API,使用起来比JDK原生API更方便,很多项目都会引入这个依赖。
首先需要引入dom4j的依赖,如果是Maven项目,在pom.xml中添加如下依赖:
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
使用dom4j格式化XML的代码示例如下:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.StringWriter;
public class XmlFormatUtil {
public static String formatXmlWithDom4j(String xmlStr) throws Exception {
// 解析XML字符串为Document对象
Document document = DocumentHelper.parseText(xmlStr);
// 创建格式化对象,设置缩进为4个空格,开启换行
OutputFormat format = OutputFormat.createPrettyPrint();
format.setIndentSize(4);
format.setEncoding("UTF-8");
// 输出到字符串
StringWriter writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(document);
xmlWriter.close();
return writer.toString();
}
public static void main(String[] args) {
String rawXml = "<?xml version="1.0" encoding="UTF-8"?><user><id>1</id><name>张三</name><age>25</age></user>";
try {
String formattedXml = formatXmlWithDom4j(rawXml);
System.out.println(formattedXml);
} catch (Exception e) {
e.printStackTrace();
}
}
}
两种方法的对比
两种方法的适用场景不同,我们可以通过下表对比两者的特点:
| 对比项 | JDK原生Transformer | dom4j库 |
|---|---|---|
| 依赖要求 | 无额外依赖,JDK自带 | 需要引入dom4j依赖 |
| API复杂度 | 代码相对繁琐,步骤较多 | API简洁,代码量少 |
| 格式化效果 | 依赖具体Transformer实现,部分场景缩进可能不符合预期 | 格式化效果稳定,可自定义配置项多 |
| 适用场景 | 不允许引入第三方依赖的项目 | 已经引入dom4j或者可以引入依赖的项目 |
注意事项
在实际使用中需要注意几个问题:
- 输入的XML字符串必须是格式正确的,否则解析会抛出异常
- 如果XML中包含特殊字符,需要确保编码设置正确,避免乱码
- 使用JDK原生方法时,不同JDK版本的Transformer实现可能有差异,缩进效果可能不同
- 如果处理超大XML字符串,需要注意内存占用,避免OOM问题
以上就是Java中格式化输出XML字符串的两种常用方法,开发者可以根据项目的实际情况选择合适的方式实现。