В этом примере вы захотите использовать аннотации @XmlElementRef
и @XmlRootElement
. Это соответствует концепции схемы XML групп замещения. Это позволит вам получить список объектов из иерархии наследования, дифференцированных по элементам.
Животные
Это будет служить корневым объектом для модели предметной области. Он имеет свойство List
, помеченное @XmlElementRef
. Это означает, что он будет соответствовать значениям на основе значения их @XmlRootElement
аннотаций.
package forum8356849;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Animals")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Cat.class, Dog.class})
public class Animals {
@XmlElementRef
private List<Animal> animals;
}
Animal
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
class Animal
{
String name;
}
Cat
Мы будем аннотировать класс Cat
аннотацией @XmlRootElement
. Используется в тандеме с аннотацией @XmlElementRef
на Animals
.
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Cat")
class Cat extends Animal
{
int numLives;
}
собака
Мы также добавим аннотацию @XmlRootElement
к классу Dog
.
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Dog")
class Dog extends Animal
{
boolean hasSpots;
}
Демо
Вы можете использовать следующий класс, чтобы увидеть, что все работает как положено. input.xml
соответствует XML, указанному в вашем вопросе.
package forum8356849;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Animals.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8356849/input.xml");
Animals animals = (Animals) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(animals, System.out);
}
}
Для получения дополнительной информации