使用 javax.xml.transform (最推荐、最灵活)
这是 Java 标准库中官方推荐的方法,它不依赖于任何具体的 XML 解析器(如 DOM 或 SAX),非常灵活,可以处理格式化、输出到文件等多种场景。

核心思想:
- 创建一个
TransformerFactory实例。 - 通过工厂创建一个
Transformer实例。 - 创建一个
DOMSource(如果已有 DOM 树)或SAXSource(如果已有 SAX 解析器)作为源。 - 创建一个
StreamResult,并指定目标是一个StringWriter。 - 调用
transformer.transform()方法进行转换。
示例代码
这个例子展示了如何从一个 XML 字符串创建一个 DOM 文档,然后再将其转换回格式化的字符串。
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.StringWriter;
public class XmlToStringTransformer {
public static void main(String[] args) {
String xmlString = "<root><user><name>张三</name><age>30</age></user><user><name>李四</name><age>25</age></user></root>";
try {
// 1. 将 XML 字符串解析为 Document 对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new java.io.ByteArrayInputStream(xmlString.getBytes("UTF-8")));
// 2. 创建 Transformer 实例
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 3. 设置输出属性 (可选,但强烈推荐)
// - indent: 是否进行缩进,使输出更易读
// - omit-xml-declaration: 是否省略 XML 声明 <?xml version="1.0" encoding="UTF-8" ?>
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 4. 创建源 (Source) 和目标 (Result)
DOMSource source = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
// 5. 执行转换
transformer.transform(source, result);
// 6. 从 StringWriter 中获取结果
String prettyXmlString = writer.toString();
System.out.println("格式化后的 XML 字符串:");
System.out.println(prettyXmlString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
格式化后的 XML 字符串:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<user>
<name>张三</name>
<age>30</age>
</user>
<user>
<name>李四</name>
<age>25</age>
</user>
</root>
使用 org.w3c.dom.Node 的 getTextContent() 方法
如果你已经有一个 DOM 树,并且只需要获取某个节点及其所有子节点的文本内容(不包含标签本身),可以使用 getTextContent(),这个方法不适合获取完整的 XML 结构。

适用场景: 提取特定元素的文本值,而不是整个 XML 文档。
示例代码
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class XmlNodeTextContent {
public static void main(String[] args) {
String xmlString = "<root><user><name>张三</name><age>30</age></user><user><name>李四</name><age>25</age></user></root>";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new java.io.ByteArrayInputStream(xmlString.getBytes("UTF-8")));
// 获取所有 <name> 节点
NodeList nameNodes = doc.getElementsByTagName("name");
for (int i = 0; i < nameNodes.getLength(); i++) {
// 获取节点的文本内容
String name = nameNodes.item(i).getTextContent();
System.out.println("找到用户名: " + name);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
找到用户名: 张三
找到用户名: 李四
直接拼接字符串 (不推荐)
对于非常简单、结构固定的 XML,你可以手动拼接字符串。但这种方法极其脆弱,不适用于任何生产环境,因为:
- 容易出错:引号、特殊字符处理非常麻烦。
- 难以维护:XML 结构变化时,代码需要大量修改。
- 不安全:无法防止 XML 注入等安全问题。
示例代码(仅作演示,切勿在生产环境使用)
public class ManualXmlString {
public static void main(String[] args) {
String name = "张三";
int age = 30;
String escapedName = name.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """).replace("'", "'");
String xmlString = "<user><name>" + escapedName + "</name><age>" + age + "</age></user>";
System.out.println(xmlString);
}
}
输出结果:
<user><name>张三</name><age>30</age></user>
使用第三方库 (如 Jackson 或 Gson)
如果你已经在使用 Jackson 或 Gson 进行 JSON 处理,它们也提供了处理 XML 的功能,通常非常简洁。
示例代码 (使用 Jackson)
你需要添加 Jackson 的 XML 模块依赖:
<!-- Maven -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;
public class JacksonXmlToString {
public static void main(String[] args) {
// 1. 创建 XmlMapper 实例
XmlMapper xmlMapper = new XmlMapper();
// 2. 准备一个 Java 对象 (POJO)
User user = new User("王五", 28);
try {
// 3. 直接将对象序列化为 XML 字符串
String xmlString = xmlMapper.writeValueAsString(user);
System.out.println("使用 Jackson 生成的 XML:");
System.out.println(xmlString);
// 4. 也可以反序列化
User deserializedUser = xmlMapper.readValue(xmlString, User.class);
System.out.println("\n反序列化后的对象: " + deserializedUser.getName());
} catch (IOException e) {
e.printStackTrace();
}
}
// 对应的 Java Bean (POJO)
static class User {
public String name;
public int age;
// Jackson 需要一个无参构造函数
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
}
输出结果:
使用 Jackson 生成的 XML: <User><name>王五</name><age>28</age></User> 反序列化后的对象: 王五
总结与选择
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
javax.xml.transform |
官方标准、灵活、功能强大(可格式化)、不依赖特定解析器 | 代码稍显冗长 | 通用场景,推荐首选,特别是需要控制输出格式时。 |
Node.getTextContent() |
简单直接,获取文本内容高效 | 只能获取文本,不能获取完整 XML 结构 | 当你只需要从 DOM 树中提取特定元素的文本值时。 |
| 手动拼接字符串 | 简单(表面) | 极其脆弱、易错、难以维护、不安全 | 绝对不推荐,仅用于学习或极简单的、非关键的硬编码场景。 |
| 第三方库 (Jackson) | 代码简洁、与 JSON 处理无缝集成、功能强大 | 需要引入外部依赖 | 项目中已使用 Jackson/Gson 等库,希望保持技术栈统一时。 |
对于在 Java 中将 XML 转换为 String 的需求,最标准、最可靠、最灵活的方法是使用 javax.xml.transform 包。
