Java 在JAXB中处理嵌套元素

Java 在JAXB中处理嵌套元素,java,jaxb,marshalling,Java,Jaxb,Marshalling,我想知道是否有可能让JAXB不为充当包装器的XML元素创建Java对象。例如,对于以下结构的XML <root> <wrapper> <entity/> </wrapper> </root> 元素应直接解组到实体字段中 使用JAXB有可能实现吗?JAXB或其他映射系统的全部要点是将元素及其层次结构映射到类。在您的示例中,您似乎希望JAXB以某种方式知道它可以将实体封送到包装器/实体中,反之亦然,而无需实

我想知道是否有可能让JAXB不为充当包装器的XML元素创建Java对象。例如,对于以下结构的XML

<root>
    <wrapper>
        <entity/>
    </wrapper>
</root>
元素应直接解组到实体字段中


使用JAXB有可能实现吗?

JAXB或其他映射系统的全部要点是将元素及其层次结构映射到类。在您的示例中,您似乎希望JAXB以某种方式知道它可以将实体封送到包装器/实体中,反之亦然,而无需实际创建用于包装器映射以及根和实体之间的连接的类。正如前面介绍的,这大致相当于询问如何在没有驱动轴的情况下将汽车发动机连接到车轮上


因此,除非我没有抓住要点,否则答案是否定的——JAXB或任何其他映射程序都无法做到这一点。您可以通过使用纯粹动态映射的方法来避免创建类(例如,请参见Groovy、GPath),但这样可以避免创建所有类,而不仅仅是跳过层次结构中的一个中间级别。

尽管它需要额外的编码,使用临时包装器对象,通过以下方式完成所需的解组:

@XmlRootElement(name = "root")
public class Root {

    private Entity entity;

    static class Entity {

    }

    static class EntityWrapper {
        @XmlElement(name = "entity")
        private Entity entity;

        public Entity getEntity() {
            return entity;
        }
    }

    @XmlElement(name = "wrapper")
    private void setEntity(EntityWrapper entityWrapper) {
        entity = entityWrapper.getEntity();
    }

}
提供了带有扩展的JAXB2.2实现。扩展功能之一是使用XPath在域模型中不需要的XML层中导航

如果你看:

您将注意到,客户的名称存储在中,但名称是Customer的字符串属性。这是通过以下方式实现的:

@XmlPath("personal-info/name/text()")
public String getName() {
    return name;
}
我希望这有帮助


Doug

值得一提的是,如果内容是
列表而不是单个实例:

<root>
    <wrapper>
        <entity/>
        <entity/>
        ...
    </wrapper>
</root>

...
然后可以使用注释:

@XmlRootElement(name = "root")
public class Root {

    @XmlElementWrapper(name = "wrapper")
    @XmlElement(name = "entity")
    private List<Entity> entity;

    static class Entity { }

}
@XmlRootElement(name=“root”)
公共类根{
@xmlementwrapper(name=“wrapper”)
@xmlement(name=“entity”)
私人上市实体;
静态类实体{}
}

在您的示例中,根本不会生成
。请发布重现问题的示例代码。让我重新表述一下:我如何注释提供的类,以便所描述的结构的XML可以被解包到它?这不是更好的。现在还不清楚你想做什么。我们需要一个例子。如果您不理解,请跳过它。JAXB是否有禁止您按照您想要的方式对XML进行解包的要求?我很确定没有。谢谢你提到这一点。我在考虑以某种方式使用XPath,很高兴知道有一个现成的实现。我也非常喜欢开发人员在外部映射文件中支持XML绑定,而不仅仅是通过注释。这允许一个域模型映射到多个XSD、版本以及不同的数据源,而不会产生任何混乱,正如Doug Clarke所解释的,这可以通过EclipseLink MOXy来实现。这个答案太误导人了。执行所需的解组是完全可能的-看起来还可以,但我认为它可以简化为仅解组对象,即从包装器向新的根对象分配N个属性。有点麻烦的解决方案…@MichałZiobro您可以自由提供自己的解决方案,这并不麻烦
@XmlRootElement(name = "root")
public class Root {

    @XmlElementWrapper(name = "wrapper")
    @XmlElement(name = "entity")
    private List<Entity> entity;

    static class Entity { }

}