JAXB: Unmarshall для различных классов на основе значения атрибута элемента - PullRequest
4 голосов
/ 31 октября 2011

Я хотел бы знать, есть ли способ демонтировать XML, который содержит фиксированное имя элемента, атрибут которого относится к различным классам.Рассмотрим следующий XML:

Случай № 1:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <request-status>valid</request-status>
    <interface name="person">
        <f-name>Joe</f-name>
        <l-name>Blow</l-name>
        <age>25</age>
        <email>joe.blow@email.com</email>
    </interface>
</response>

Случай № 2:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <request-status>valid</request-status>
    <interface name="vehicle">
        <make>Ford</make>
        <type>truck</type>
        <year>1989</year>
        <model>F150</model>
    </interface>
</response>

В обоих случаях содержащий класс является «response», с2 переменные экземпляра: requestStatus (String) и interface (какой-нибудь суперкласс?).Мне нужна помощь в том, как написать содержащий класс "Response" с правильными аннотациями JAXB, чтобы unmarshall создавал правильные экземпляры класса для переменной "interface".

Заранее большое спасибо за любыепомощь.

1 Ответ

4 голосов
/ 31 октября 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222 ) экспертная группа.

Вы можете использовать расширение MOXy @XmlDescriminatorNode / @XmlDescriminatorValue JAXB.

База

@XmlDiscriminatorNode("@name")
public abstract class Base {
}

Человек

@XmlDiscriminatorValue("person")
public class Person extends Base {
}

Автомобиль

@XmlDiscriminatorValue("vehicle")
public class Vehicle extends Base {
}     

Для получения дополнительной информации

Ниже приведен ответ на аналогичный вопрос, который использует более старую версию MOXy API:

...