Bạn có thể thay đổi mô hình của bạn và làm như sau:
gốc
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement(name="parent")
List<Parent> allParents;
}
Parent
@XmlAccessorType(XmlAccessType.FIELD)
public class Parent {
@XmlElement(name="child")
List<Child> allChildren;
}
CẬP NHẬT
Có thể tránh được những tầng lớp phụ huynh?
Có một vài cách khác nhau để thực hiện điều này:
OPTION # 1 - Bất kỳ thực hiện JAXB sử dụng XmlAdapter
Bạn có thể sử dụng một XmlAdapter cho hầu như thêm trong lớp Parent
.
ChildAdapter
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class ChildAdapter extends XmlAdapter<ChildAdapter.Parent, Child> {
public static class Parent {
public Child child;
}
@Override
public Parent marshal(Child v) throws Exception {
Parent parent = new Parent();
parent.child = v;
return parent;
}
@Override
public Child unmarshal(Parent v) throws Exception {
return v.child;
}
}
gốc
Các @XmlJavaTypeAdapter
chú thích được sử dụng để tham khảo các XmlAdapter
.
import java.util.List;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement(name="parent")
@XmlJavaTypeAdapter(ChildAdapter.class)
List<Child> allChildren;
}
Child
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Child {
@XmlAttribute
int id;
@XmlAttribute
String name;
}
OPTION # 2 - Sử dụng EclipseLink JAXB (MOXY)
Nếu bạn đang sử dụng EclipseLink JAXB (MOXy) như thực hiện JAXB (JSR-222) của bạn thì bạn có thể làm như sau (Lưu ý : Tôi là trưởng nhóm MOXy):
gốc
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement(name="parent")
List<Child> allChildren;
}
Child
@XmlPath
chú thích MOXY của hoạt động khá giống như cách bạn đang cố gắng sử dụng @XmlElement
chú thích trong bài viết của bạn.
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlAccessorType(XmlAccessType.FIELD)
public class Child {
@XmlPath("child/@id")
int id;
@XmlPath("child/@name")
String name;
}
Để biết thêm thông tin
Có thể tránh lớp cha mẹ không? – Stephan
+1 Luôn yên tâm khi tôi độc lập đưa ra giải pháp giống hệt như một chuyên gia được công nhận trong lĩnh vực :-) –
@IanRoberts - Tôi cũng đã +1 câu trả lời của bạn :). –