JAXB: unmarshalling xml с несколькими именами для одного и того же элемента

Я полагаю, это будет легко для тех, кто действительно понимает файлы привязки 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, где каждый сотрудник имеет только имя firstName и lastName.

(Примечание: каждый сотрудник будет иметь тип Employee NOT Director/Manager/Staff. Информация о подклассе будет потеряна при unmarshalling. Мы также не заботимся о том, чтобы маршировать обратно - нам нужно только создавать объекты из XML)

Можно ли это сделать без расширений, таких как MOXy? Может ли пользовательский файл bindings.xjb сохранить день?

Ответ 1

Это соответствует структуре выбора. Вы можете использовать аннотацию @XmlElements для этого варианта использования:

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

Если вы начинаете с XML-схемы, это поможет: