如何使用JAXB解组重复的嵌套类?

如何指示JAXB处理此问题?

XML

              

Root.java

 @XmlRootElement public class Root { @XmlElement(name="parent/child") List allChildren; } 

这不起作用… allChildren是空的。

您可以更改模型并执行以下操作:

 @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Root { @XmlElement(name="parent") List allParents; } 

 @XmlAccessorType(XmlAccessType.FIELD) public class Parent { @XmlElement(name="child") List allChildren; } 

UPDATE

是否可以避免父类?

有几种不同的方法可以实现这一目标:

选项#1 – 使用XmlAdapter的任何JAXB实现

您可以使用XmlAdapter虚拟添加Parent类。

ChildAdapter

 import javax.xml.bind.annotation.adapters.XmlAdapter; public class ChildAdapter extends XmlAdapter { 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; } } 

@XmlJavaTypeAdapter注释用于引用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 allChildren; } 

儿童

 import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Child { @XmlAttribute int id; @XmlAttribute String name; } 

选项#2 – 使用EclipseLink JAXB(MOXy)

如果您使用EclipseLink JAXB(MOXy)作为JAXB(JSR-222)实现,那么您可以执行以下操作(注意:我是MOXy主管):

 import java.util.List; import javax.xml.bind.annotation.*; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Root { @XmlElement(name="parent") List allChildren; } 

儿童

MOXy的@XmlPath注释与您尝试在post中使用@XmlElement注释的方式非常相似。

 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; } 

了解更多信息

您必须创建一个表示元素的类,例如

 @XmlAccessorType(XmlAccessType.FIELD) public class Parent { @XmlElement(name="child") Child child; } 

然后,您可以创建一个类型适配器

 public class ParentToChildAdapter extends XmlAdapter { public Parent marshal(Child c) { Parent p = new Parent(); p.child = child; return p; } public Child unmarshal(Parent p) { return p.child; } } 

并在根类上使用它

 @XmlRootElement public class Root { @XmlElement(name="parent") @XmlJavaTypeAdapter(ParentToChildAdapter.class) List allChildren; } 

您可以尝试使用XmlElementWrapper注释,但我不确定它应该如何与多个包装器节点一起使用:

 @XmlRootElement public class Root { @XmlElementWrapper(name="parent") @XmlElement(name="child") List allChildren; } 

试试这个

 @XmlRootElement class Root { List allChildren = new ArrayList(); private static class Parent { @XmlElement Child child; } @XmlElement public void setParent(Parent p) { allChildren.add(p.child); } }