Ví dụ này, bạn sẽ muốn sử dụng các chú thích @XmlElementRef
và @XmlRootElement
. Điều này tương ứng với khái niệm lược đồ XML của các nhóm thay thế. Điều này sẽ cho phép bạn có một danh sách các đối tượng từ một hệ thống phân cấp thừa kế được phân biệt bởi phần tử.
vật
này sẽ đóng vai trò là đối tượng gốc cho các mô hình miền. Nó có thuộc tính List
được chú thích với @XmlElementRef
. Điều này có nghĩa là nó sẽ khớp với các giá trị dựa trên giá trị của các chú thích @XmlRootElement
của chúng.
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;
}
Cát
Chúng tôi sẽ chú thích các lớp Cat
với chú thích @XmlRootElement
. Điều này được sử dụng song song với chú thích @XmlElementRef
trên Animals
.
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Cat")
class Cat extends Animal
{
int numLives;
}
Chó
Chúng tôi cũng sẽ thêm một chú thích @XmlRootElement
đến lớp Dog
.
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Dog")
class Dog extends Animal
{
boolean hasSpots;
}
Demo
Bạn có thể sử dụng lớp sau đây để thấy rằng mọi thứ hoạt động như mong đợi. input.xml
tương ứng với XML được cung cấp trong câu hỏi của bạn.
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);
}
}
Để biết thêm Inforation
Nguồn
2011-12-02 13:30:57
Cảm ơn! Tôi sẽ cho nó một viên đạn! – fbl
Ahh, tôi gặp phải một chút ...Ứng dụng của tôi cần hỗ trợ các plugin, '@XmlSeeAlso ({Cat.class, Dog.class})' ngụ ý rằng tôi cần biết về những người quyết định của tôi trong thời gian biên dịch. Bất kỳ cách nào xung quanh đó? – fbl
@fbl - Bạn không cần phải sử dụng XmlSeeAlso nhưng JAXBContext không cần phải biết về các lớp con. Bạn có thể tìm thấy cách tiếp cận sau phù hợp hơn: http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html –