2014-02-19 31 views
1

这里是XML的一个片段,我想用SimpleFramework反序列化:我怎样才能解析ElementList的路径?

<rs><r> 
    <id>23</id> 
    <bar>blargh</bar> 
    <c><v>value 1</v></c> 
    <c><v>value 2</v></c> 
    <c><v>yet another value</v></c> 
    <c><v>moar value</v></c> 
</r></rs> 

我想直到结束是一个包含所有元素的内容的元素列表。我想象类似:

@Root(strict=false) 
public static class Foo { 
    @Element(name="id") 
    public int id; 
    @Element(name="bar") 
    public String info; 
    @Path("c") 
    @ElementList(entry="v", inline=true, required=false, empty = false) 
    public List<String> values; 
} 

我试图做的是向下达到过去的“C”元素并直接进入该列表中的每个成员的“V”元素。上面的代码不会这样做。我想要@Path(“c”)语句应用于列表中的每个元素,但我无法弄清楚如何完成这项工作。

+0

不错的问题,+1。 – ollo

回答

1

我看到两个问题在这里:

  1. <rs><r>...</r></rs>嵌套的标签元素(不 知道@Path可以处理这个问题...)
  2. 每个条目的两个标签(<c><v>...</v></c>)不可能 到@ElementList注释(并且不能为每个条目设置@Path

作为一个解决方案,你可以写两个包装类

  • 一个,那包根节点
  • 另外一个,这是摆在列表中,包裹每一个条目

这里来实施:

FooWrapper

这个类包装一个Foo类;你通过包装器和实际物体的r标签获得rs标签。

@Root(name = "rs") 
public class FooWrapper 
{ 
    @Element(name = "r", required = true) 
    private Foo f; 


    public FooWrapper(Foo f) // Required just in case you want to serialize this object 
    { 
     this.f = f; 
    } 

    FooWrapper() { } // At least a default ctor is required for deserialization 
} 

Foo

这里没有什么特别。只有列表条目的类型更改为EntryWrapper

@Root(strict = false) 
public class Foo /* A */ 
{ 
    @Element(name = "id") 
    public int id; /* B */ 
    @Element(name="bar") 
    public String info; 
    @ElementList(entry="c", inline=true, required=false, empty = false) 
    public List<EntryWrapper> values; // Replacing the String with the EntryWrapper 

    // ... 
} 
  • /* A */:在你的代码,这是static过,我刚刚删除它,因为我把它变成自己的类文件。
  • /* B */:更好:封装字段,使它们成为private并写入getter/setter。

EntryWrapper

列表中的每个条目被包裹成这样的包装对象。顺便说一句。无需公开此类public

public class EntryWrapper 
{ 
    @Element(name = "v") 
    private String value; 


    public EntryWrapper(String value) 
    { 
     this.value = value; 
    } 

    EntryWrapper() { } // Once again, at least one default ctor is required for deserialization 

    // ... 
} 
+0

是的,这是我在等待更好的答案时实现它的方式。我希望避免EntryWrapper类只有一个值。对于一个或两个关卡来说这不是什么大问题,但我想我会遇到需要解析几个嵌套元素的情况,每个嵌套元素都有一个孩子,直到我获得一个值。我会将此标记为已接受。我想没有比这更好的了。 – kbyrd

+0

如果你遇到非常困难的元素,你可以关于一个'Converter'的东西。查看简单的文档以获取更多信息和示例。 – ollo