JAXB:使用多个名称解组具有相同元素的xml

11

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

基本问题

如何配置JAXB将多个元素反编组成同一个类?

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

背景

我有一个XML文档,其中包含许多相同元素的变化--每个元素都具有完全相同的属性。在下面的示例中,我只关心“Employees”,但XML指定了“directors,managers和staff”。对于我们的目的,这些都是同一父类的子类,我们只需要使用父类型(Employee),并且我们的对象模型没有或不需要子类实例。

我希望JAXB将director、manager或staff元素的任何实例绑定到对象中。

示例

输入:

<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,每个员工仅有firstName和lastName两个属性。

(注意:每个员工都将是类型为Employee而不是Director/Manager/Staff。子类信息将在解组时丢失。我们也不关心重新组合--我们只需要从XML创建对象)

这能不能在不使用MOXy等扩展的情况下完成?自定义的bindings.xjb文件可以拯救一下吗?


1
希望@BlaiseDoughan能看到你的问题,因为他最近在这个网站上很活跃,而且他对JAXB非常了解。他的博客是值得一读的。 - Hovercraft Full Of Eels
1
如果能做到这点,那就太棒了。如果是这样的话...我拥有各种各样的赞和声望点数,上面都刻着他的名字!; ) - gMale
1个回答

16

这对应于一个选择结构。你可以使用@XmlElements注释来实现此用例:

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

如果你是从一个XML schema开始的,以下内容可能会有所帮助:


2
您,先生,真是个天才!运行得非常好! - gMale
1
作为后续:是否有任何简单的方法来保留原始元素名称(例如将其作为属性传递给正在创建的对象)? - gMale
1
在JAXB中,您可以将结果包装在“JAXBElement”中。将该值存储在属性中的能力是我们正在考虑添加到MOXy中的内容。 - bdoughan
@gmale - 你可以在这里对增强请求进行正式投票:https://bugs.eclipse.org/bugs/show_bug.cgi?id=298125 - bdoughan
@BlaiseDoughan 这个也可以用外部映射文件实现吗?我试过<xml-elements>但是没成功。 - BigBen
1
@BigBen - 我看到你已经解决了这个问题:https://dev59.com/cHDYa4cB1Zd3GeqPDr_B#15917708(我给你的问题和答案都点了+1)。 - bdoughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接