如何使用Simple Xml Framework反序列化表示根级别数组的xml

时间:2014-08-19 16:09:29

标签: java xml deserialization simple-framework

我在Android上使用Simple XML framework进行反序列化。

我需要反序列化的xml大致如下:

<?xml version="1.0" encoding="UTF-8"?>
<elements type="array">
    <element foo="x"/>
    <element foo="y"/>
</elements>

换句话说,它是根级别的数组。

如何定义我可以反序列化的模型类?

我尝试了以下内容:

@Root (name = "elements")
public class Elements implements Serializable {
   private static final long serialVersionUID = ...

   @ElementArray (name = "element")
   private List<Element> elements;
}

但它失败了,因为没有type字段来说明xml中的type属性。

添加type字段(仅为了满足解串器)不能解决问题,而是生成另一个错误:org.simpleframework.xml.core.InstantiationException: Type is not an array interface java.util.List for field 'elements' ...

实施Elements课程的正确方法是什么?即使在时间压力下,我想要一个干净的解决方案,而不是一些hackish解决方法(我可能会想到)。

2 个答案:

答案 0 :(得分:1)

在Elements类中,您应该使用@ElementList并添加名为&#34的属性;键入&#34;

@ElementList(name="elements", inline=true)
private List<Element> elements;

@Attribute(name="type")
private String type;

此外,如果您不想打扰xml中的type属性,只需添加required=false,如下所示:

@Attribute(name="type", required=false)

答案 1 :(得分:1)

正确的解决方案是:

public class Elements implements Serializable {
   private static final long serialVersionUID = ...

   @Attribute (name = "type", required = false)
   private String type;

   @ElementList (name = "elements", entry = "element", inline = true)
   private List<Element> elements;
}

J. Marcos的回答是正确的,指出我应该使用ElementListinline属性。

仍然缺少的是删除Root注释(我猜它与内联列表的想法冲突),并添加entry属性,该属性指定数组元素的名称。

如果标记与字段名称相同(如我的设计示例中),则可能不需要,但如果它们不同(例如,类中的elementItemelement_item中的{{1}} xml),显然是。