如何使用Path解析ElementList?

时间:2014-02-19 16:53:28

标签: java xml simple-framework

以下是我想用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”)语句应用于列表中的每个元素,但我无法弄清楚如何进行工作。

1 个答案:

答案 0 :(得分:2)

我在这里看到两个问题:

  1. <rs><r>...</r></rs> root 元素的嵌套标记(不是 确定@Path是否可以处理此问题......)
  2. 每个条目的两个标签(<c><v>...</v></c>)是不可能的 通过@ElementList注释(并且无法为每个条目设置@Path
  3. 作为解决方案,您可以编写两个 包装类

    • 一,包装根节点
    • 另一个,放在列表中,包装每个条目

    以下是实施:

    班级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
    
        // ...
    }