11

我认为这对于真正了解 JAXB 绑定文件的人来说很容易......

基本问题

如何配置 JAXB 以将多个元素解组到同一个类中?

注意:我想避免向我的项目添加另一个依赖项(如 MOXy)。理想情况下,这可以通过注释或自定义绑定文件来完成。

背景

我有一个 XML 文档,其中包含相同元素的许多变体——每个都具有完全相同的属性。使用下面的示例,我只关心“员工”,但 XML 指定了“董事、经理和员工”。出于我们的目的,这些都是同一个父类的子类,我们只需要使用父类(Employee),我们的对象模型没有或不需要子类的实例。

我希望 JAXB 将任何director, manager, or staff元素实例绑定到一个Employee对象中。

例子

输入:

<organization>
    <director>
        <fname>Dan</fname>
        <lname>Schman</lname>
    </director>    
    <manager>
        <fname>Joe</fname>
        <lname>Schmo</lname>
    </manager>    
    <staff>
        <fname>Ron</fname>
        <lname>Schwan</lname>
    </staff>    
    <staff>
        <fname>Jim</fname>
        <lname>Schwim</lname>
    </staff>    
    <staff>
        <fname>Jon</fname>
        <lname>Schwon</lname>
    </staff>    
</organization>

输出:

解组此示例后,我将得到一个Organization具有一个属性的对象:List<Employees> employees其中每个员工只有一个名字和姓氏。

(注意:每个员工都是EmployeeNOT类型Director/Manager/Staff。解组时子类信息会丢失。我们也不关心编组返回——我们只需要从 XML 创建对象)

这可以在没有像 MOXy 这样的扩展的情况下完成吗?自定义 bindings.xjb 文件可以节省时间吗?

4

1 回答 1

16

这对应于选择结构。您可以@XmlElements为此用例使用注释:

@XmlElements({
    @XmlElement(name="director", type=Employee.class),
    @XmlElement(name="manager", type=Employee.class)
})
List<Employee> getEmployees() {
    return employees;
}

如果您从 XML 模式开始,以下内容将有所帮助:

于 2012-06-20T21:21:30.200 回答