Java怎么将List集合写入XML文件

最常用且推荐的方式是使用JAXB,需将List包装进带@XmlRootElement的容器类(如Users),再通过JAXBContext和Marshaller序列化为XML文件。

Java将List集合写入XML文件,最常用且推荐的方式是使用JAXB(Java Architecture for XML Binding),它原生支持Java对象与XML之间的双向转换,无需手动拼接字符串,安全、简洁、可维护性强。

前提:确保List中的元素类型支持JAXB

JAXB要求被序列化的类必须是“可绑定的”——即有无参构造方法、字段或属性有标准getter/setter、类上最好加@XmlRootElement注解。例如:

@XmlRootElement(name = "user")
public class User {
    private String name;
    private int age;

    public User() {} // 必须有无参构造

    // getter/setter

省略... }

用JAXB将List写入XML文件(核心步骤)

因为JAXB不直接支持List作为根元素,需包装成一个容器类(如Users),再标注@XmlElement声明列表项标签名:

  • 定义包装类Users,用@XmlRootElement标记,并用@XmlElement(name = "user")修饰List字段
  • 创建JAXBContext,传入包装类(不是List本身)
  • 获取Marshaller,设置格式化输出(可选),调用marshal()写入File或OutputStream

示例代码:

@XmlRootElement(name = "users")
public class Users {
    @XmlElement(name = "user")
    private List list = new ArrayList<>();

    public Users() {}
    public Users(List list) { this.list = list; }
    // getter/setter
    public List getList() { return list; }
    public void setList(List list) { this.list = list; }
}

// 写入XML文件
List userList = Arrays.asList(new User("张三", 25), new User("李四", 30));
Users users = new Users(userList);

try {
    JAXBContext context = JAXBContext.newInstance(Users.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 美化缩进
    marshaller.marshal(users, new File("users.xml"));
} catch (JAXBException e) {
    e.printStackTrace();
}

替代方案:使用DOM或第三方库(如SimpleXML、Jackson XML)

若项目已引入其他XML库,或需更灵活控制结构,可考虑:

  • DOM方式:手动构建Document树,适合简单场景,但代码冗长、易出错
  • SimpleXML:轻量,注解风格类似JAXB,需额外依赖org.simpleframework:simple-xml
  • Jackson XML:和JSON用法一致,需com.fasterxml.jackson.dataformat:jackson-dataformat-xml,对List支持更直接(可配置RootName)

注意事项

使用JAXB时注意:

  • JDK 11+已默认移除JAXB模块,需显式添加Maven依赖:javax.xml.bind:jaxb-api + org.glassfish.jaxb:jaxb-runtime
  • 中文字符需确保XML声明含encoding="UTF-8",JAXB默认生成的就是UTF-8,写入File时无需额外处理
  • 字段为null时默认不输出;如需保留空标签,可用@XmlElement(nillable = true)

基本上就这些。用JAXB是最自然、最符合Java习惯的方式,只要包装好List,一行marshal就能搞定。