You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用SimpleFramework XML序列化器将指定XML转为Java对象列表?

当然可以用Simple Framework XML实现这个转换!

完全没问题,Simple Framework就是专门用来处理XML与Java对象之间序列化/反序列化的工具,只需要给你的Java类添加对应的注解,就能自动完成XML结构到Java对象的映射。下面是具体的实现方案,完全贴合你的需求:

1. 先引入Simple Framework依赖

如果用Maven管理项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.simpleframework</groupId>
    <artifactId>simple-xml</artifactId>
    <version>2.7.1</version>
</dependency>

Gradle用户则在build.gradle中对应添加:

implementation 'org.simpleframework:simple-xml:2.7.1'

2. 编写带注解的Java实体类

根据你的XML层级结构,我们需要为每个XML节点创建对应的Java类,并通过Simple Framework的注解指定映射关系:

Container类(对应<container>节点)

用来映射XML中每个带title和slug属性的container元素:

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;

@Root(name = "container")
public class Container {
    @Attribute(name = "title")
    private String title;
    
    @Attribute(name = "slug")
    private String slug;

    // 必须提供无参构造器(Simple Framework序列化/反序列化时需要)
    public Container() {}

    // Getter & Setter方法
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    public String getSlug() { return slug; }
    public void setSlug(String slug) { this.slug = slug; }
}

Category类(对应<category>节点)

这个类包含多个<container>子节点,所以用@ElementList注解来映射列表,注意inline=true表示列表元素直接作为当前节点的子元素,没有额外的包裹节点:

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

import java.util.List;

@Root(name = "category")
public class Category {
    @Attribute(name = "id")
    private String id;
    
    @ElementList(inline = true, required = false)
    private List<Container> containerList;

    public Category() {}

    // Getter & Setter方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public List<Container> getContainerList() { return containerList; }
    public void setContainerList(List<Container> containerList) { this.containerList = containerList; }
}

Body类(对应<body>节点)

用来包裹<category>节点:

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name = "body")
public class Body {
    @Element(name = "category")
    private Category category;

    public Body() {}

    // Getter & Setter方法
    public Category getCategory() { return category; }
    public void setCategory(Category category) { this.category = category; }
}

Page类(对应根节点<page>)

作为XML的根对象,包裹<body>节点:

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name = "page")
public class Page {
    @Element(name = "body")
    private Body body;

    public Page() {}

    // Getter & Setter方法
    public Body getBody() { return body; }
    public void setBody(Body body) { this.body = body; }
}

你的HomeXML封装类

如果你需要用自定义的HomeXML类来统一封装这些对象,可以这样写:

public class HomeXML {
    private Page page;

    public HomeXML() {}

    // Getter & Setter方法
    public Page getPage() { return page; }
    public void setPage(Page page) { this.page = page; }
}

3. 反序列化XML到Java对象的代码示例

下面是读取XML内容并转换成Java对象的实际代码:

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

import java.io.StringReader;

public class XmlConverter {
    public static void main(String[] args) {
        // 你的XML内容
        String xmlContent = "<page>\n" +
                " <body>\n" +
                " <category id=\"category-0_2\">\n" +
                " <container title=\"Spotlight\" slug=\"spotlight\"></container>\n" +
                " <container title=\"Just Added Shows\" slug=\"just_added_shows\"></container>\n" +
                " <container title=\"Originals\" slug=\"originals\"></container>\n" +
                " <container title=\"Popular TV Shows\" slug=\"popular_tv_shows\"></container>\n" +
                " <container title=\"Wonder Women\" slug=\"wonder_women\"></container>\n" +
                " </category>\n" +
                " </body>\n" +
                "</page>";

        Serializer serializer = new Persister();
        try {
            // 直接将XML反序列化为Page对象
            Page page = serializer.read(Page.class, new StringReader(xmlContent));
            
            // 封装到HomeXML中
            HomeXML homeXML = new HomeXML();
            homeXML.setPage(page);
            
            // 验证转换结果
            Category category = page.getBody().getCategory();
            System.out.println("Category ID: " + category.getId());
            for (Container container : category.getContainerList()) {
                System.out.printf("Title: %s | Slug: %s%n", container.getTitle(), container.getSlug());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键注解说明

  • @Root:标记Java类对应的XML节点名称
  • @Attribute:映射XML元素的属性字段
  • @Element:映射单个子XML元素
  • @ElementList(inline = true):当列表元素直接作为父节点的子元素(无额外包裹节点)时,用该注解映射列表集合

这样就完全不需要手动解析XML,通过Simple Framework的API就能自动完成你想要的转换了。

内容的提问来源于stack exchange,提问作者Ezio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:50:20