在Java开发中,将List集合转换为XML字符串是常见需求,不同的实现方式适用不同的场景,下面介绍几种主流的实现方法。

方法一:使用JDK原生DOM API实现
JDK自带的org.w3c.dom包提供了DOM操作相关的类,不需要引入额外依赖就可以完成转换,适合对依赖有严格限制的项目。
实现步骤
- 创建DocumentBuilderFactory实例,获取DocumentBuilder
- 新建Document文档对象,创建根节点
- 遍历List集合,为每个元素创建对应的子节点并添加属性或文本
- 使用Transformer将Document转换为XML字符串
代码示例
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
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 java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
public class ListToXmlDemo {
// 定义实体类
static class User {
private Integer id;
private String name;
private Integer age;
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public static void main(String[] args) throws Exception {
// 准备测试数据List
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 20));
userList.add(new User(2, "李四", 22));
userList.add(new User(3, "王五", 25));
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建Document对象
Document document = builder.newDocument();
// 创建根节点users
Element rootElement = document.createElement("users");
document.appendChild(rootElement);
// 遍历List添加子节点
for (User user : userList) {
Element userElement = document.createElement("user");
// 添加id属性
userElement.setAttribute("id", String.valueOf(user.getId()));
// 添加name子节点
Element nameElement = document.createElement("name");
Text nameText = document.createTextNode(user.getName());
nameElement.appendChild(nameText);
userElement.appendChild(nameElement);
// 添加age子节点
Element ageElement = document.createElement("age");
Text ageText = document.createTextNode(String.valueOf(user.getAge()));
ageElement.appendChild(ageText);
userElement.appendChild(ageElement);
// 将user节点添加到根节点
rootElement.appendChild(userElement);
}
// 将Document转换为XML字符串
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 设置输出属性,缩进格式
transformer.setOutputProperty("encoding", "UTF-8");
transformer.setOutputProperty("indent", "yes");
DOMSource domSource = new DOMSource(document);
StringWriter writer = new StringWriter();
StreamResult streamResult = new StreamResult(writer);
transformer.transform(domSource, streamResult);
String xmlString = writer.toString();
System.out.println(xmlString);
}
}
方法二:使用XStream第三方库实现
XStream是一个简单的库,用于将对象序列化为XML,或者将XML反序列化为对象,使用起来非常简洁,不需要手动创建DOM节点,适合快速开发场景。
引入依赖
如果是Maven项目,需要在pom.xml中添加以下依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.20</version>
</dependency>
代码示例
import com.thoughtworks.xstream.XStream;
import java.util.ArrayList;
import java.util.List;
public class XStreamListToXmlDemo {
// 实体类,需要和前面的User类一致,这里省略getter方法定义
static class User {
private Integer id;
private String name;
private Integer age;
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
}
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 20));
userList.add(new User(2, "李四", 22));
userList.add(new User(3, "王五", 25));
XStream xStream = new XStream();
// 设置别名,让生成的XML标签更简洁
xStream.alias("user", User.class);
xStream.alias("users", List.class);
// 将List转换为XML字符串
String xmlString = xStream.toXML(userList);
System.out.println(xmlString);
}
}
两种方式的对比
两种实现方式各有优劣,开发者可以根据项目需求选择:
| 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| JDK原生DOM API | 无额外依赖,兼容性好,所有Java环境都支持 | 代码编写繁琐,需要手动处理节点创建和属性设置 | 不允许引入第三方依赖的项目,对XML结构有精细控制需求的场景 |
| XStream库 | 代码简洁,开发效率高,自动处理对象到XML的映射 | 需要引入第三方依赖,可能存在版本兼容问题 | 快速开发项目,对XML结构没有特殊要求,允许引入依赖的场景 |
注意事项
- 使用DOM API时,要注意
Document对象的创建方式,避免重复创建工厂实例影响性能 - XStream默认会序列化所有字段,如果需要排除某些字段,可以使用
xStream.omitField(Class, String)方法 - 生成的XML字符串如果需要传输或者存储,建议指定统一的编码格式,比如UTF-8,避免乱码问题
- 如果List中的元素是复杂对象,包含嵌套结构,两种方式都支持嵌套转换,只需要保证对象的getter方法正常即可