如何使用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); } }