以下是我想用SimpleFramework反序列化的XML片段:
<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>
我最终想要的是一个包含所有元素内容的ElementList。我想象的是:
@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 :(得分:2)
我在这里看到两个问题:
<rs><r>...</r></rs>
是 root 元素的嵌套标记(不是
确定@Path
是否可以处理此问题......)<c><v>...</v></c>
)是不可能的
通过@ElementList
注释(并且无法为每个条目设置@Path
)作为解决方案,您可以编写两个 包装类 :
以下是实施:
FooWrapper
这个类包装了一个Foo
类;你通过包装器和带有实际对象的r-tag获得rs-tag。
@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
// ...
}