java - JAXB:为同一元素解码具有多个名称的 xml

标签 java xml binding jaxb unmarshalling

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

基本问题

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

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

背景

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

我希望 JAXB 绑定(bind) 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每个员工只有名字和姓氏。

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

如果没有像 MOXy 这样的扩展,可以做到这一点吗?自定义 bindings.xjb 文件可以挽救局面吗?

最佳答案

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

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

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

关于java - JAXB:为同一元素解码具有多个名称的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11128191/

相关文章:

java - 如何从org.jdom.Document中的xml对象获取数据?

java - 计算两个 Java 日期实例之间的差异

c# - 防止 XmlReader 扩展 XML 实体

wpf - WPF 样式中的绑定(bind)导致莫名其妙的 "Cannot find governing FrameworkElement"错误

c# - 绑定(bind)不适用于数据模板中的数据模板

java - Spring MVC 表单 - 引用对象的模型

java - Activity 不是 Android Studio 中的封闭类

Go 中的 XML - 如何获取任一标记并将其与结构的字段匹配?

java - 如何修改多个XML标签的值?

c# - 在我的项目 Xamarin 中实现 INotifyPropertyChanged