能否用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
相关产品推荐
相关产品推荐

