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

Java 如何使用JAXB解组重复的嵌套类?,java,jaxb,Java,Jaxb,我如何指示JAXB处理这个问题 XML <root> <parent> <child id="1" name="foo" /> </parent> <parent> <child id="3" name="foo2" /> </parent> <parent> <child id="4" name="bar2" /> </parent> &

我如何指示JAXB处理这个问题

XML

<root>
 <parent>
    <child id="1" name="foo" />
 </parent>
 <parent>
    <child id="3" name="foo2" />
 </parent>
 <parent>
    <child id="4" name="bar2" />
 </parent>
 <parent>
    <child id="2" name="bar" />
 </parent>
</root>

Root.java

@XmlRootElement
public class Root {
   @XmlElement(name="parent/child")
   List<Child> allChildren;
}
@XmlRootElement
公共类根{
@xmlement(name=“父/子”)
列出所有儿童;
}

这不管用。。。allChildren为空。

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

@XmlRootElement
public class Root {
   @XmlElementWrapper(name="parent")
   @XmlElement(name="child")
   List<Child> allChildren;
}
@XmlRootElement
公共类根{
@xmlementwrapper(name=“parent”)
@xmlement(name=“child”)
列出所有儿童;
}

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

根目录

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

   @XmlElement(name="parent")
   List<Child> allChildren;

}
根目录

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

   @XmlElement(name="parent")
   List<Child> allChildren;

}
@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<Child> allChildren;

}
选项#2-使用EclipseLink JAXB(MOXy)

如果您正在使用as作为实现,则可以执行以下操作(注意:我是MOXy负责人):

根目录

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

   @XmlElement(name="parent")
   List<Child> allChildren;

}
了解更多信息

试试这个

@XmlRootElement
class Root {
    List<Child> allChildren = new ArrayList<Child>();

    private static class Parent  {
        @XmlElement
        Child child;
    }

    @XmlElement
    public void setParent(Parent p) {
        allChildren.add(p.child);
    }
}
@XmlRootElement
类根{
List allChildren=new ArrayList();
私有静态类父类{
@XmlElement
儿童;
}
@XmlElement
公共无效集合父级(父级p){
添加(p.child);
}
}

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

@XmlAccessorType(XmlAccessType.FIELD)
public class Parent {
   @XmlElement(name="child")
   Child child;
}
然后可以创建一个类型适配器

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

  public Child unmarshal(Parent p) {
    return p.child;
  }
}
公共类ParentToChildAdapter扩展了XmlAdapter{
公共父封送员(子c){
父级p=新父级();
p、 孩子=孩子;
返回p;
}
公共子解组(父级p){
返回p.child;
}
}
并在根类上使用它

@XmlRootElement
public class Root {
   @XmlElement(name="parent")
   @XmlJavaTypeAdapter(ParentToChildAdapter.class)
   List<Child> allChildren;
}
@XmlRootElement
公共类根{
@xmlement(name=“parent”)
@XmlJavaTypeAdapter(ParentToChildAdapter.class)
列出所有儿童;
}

有可能避免父类吗?+1当我独立提出与该领域公认专家完全相同的解决方案时,总是让人放心:-)@IanRoberts-I+1也给出了你的答案:)。我只有一个孩子,而不是所有的孩子。是的,他有,但父类只是一个把戏,只是一个私人类。最重要的是,我们有列表而不是列表