使用JAXB映射通用的嵌套XML数据结构

时间:2017-08-16 07:39:50

标签: java xml generics jaxb

我试图将以下嵌套结构映射到列表。问题是<list>可以嵌套。因此,顶级列表可以包含一个或多个其他列表,而这些列表又包含一些元素,例如我的示例中的<property>

<operator name="A2">
    <list name="table">
        <list>
            <property name="A1" value="1" dataType="boolean"/>
            <property name="b" value="1" dataType="boolean"/>
        </list>
    </list>
</operator>

<list>也可以直接包含<property>元素而无需进一步嵌套:

<operator name="A3">
    <list name="xyz">
        <property name="x" value="1.9" dataType="double"/>
        <property name="y" value="0.2" dataType="double"/>
    </list>
</operator>

我试图像这样映射:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "list")
public class List<T> {

    @XmlAttribute(name="name")
    public String name;

    @XmlAnyElement
    public T topLevelList;

    public List() {}
}

但是,只有外部列表才会被映射。这是第一个XML块的打印toString调用的相关部分:

Operator{list=List{name='table', topLevelList=[list: null]}}

如何使用JAXB映射此类结构?

1 个答案:

答案 0 :(得分:1)

1)那里不需要@XmlRootElement。尝试将此注释仅存储在示例中的运算符之类的实际根元素中。

2)如果您确定List应该包含List,则不能使用generic。只需创建两个独立的字段。

可能的解决方案示例:

@XmlAccessorType(XmlAccessType.FIELD)
public class List {

    @XmlAttribute(name="name")
    public String name;

    @XmlElement(name = "list")
    public List nestedList;

    @XmlElement(name = "property")
    public List<Property> properties;
...
}