处理JAXB中的嵌套元素

Unc*_*ter 13 java jaxb marshalling

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

<root>
    <wrapper>
        <entity/>
    </wrapper>
</root>
Run Code Online (Sandbox Code Playgroud)

我根本不想要<wrapper>创建一个对象.所以对于像这样的课程

class Root {
    private Entity entity;
}
Run Code Online (Sandbox Code Playgroud)

<entity>元件应直接解组到实体字段.

是否可以使用JAXB实现?

Unc*_*ter 7

虽然它需要额外的编码,但是使用瞬态包装器对象以下列方式完成所需的解组:

@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();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @MichałZiobro您可以自由提供自己的解决方案,这并不麻烦 (2认同)

Dou*_*rke 5

EclipseLink MOXy提供了带扩展的JAXB 2.2实现.扩展功能之一是使用XPath来浏览您在域模型中不需要的XML层.

如果你看看:

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions

您会注意到客户的名称存储在其中,但该名称是Customer的String属性.这是通过以下方式完成

@XmlPath("personal-info/name/text()")
public String getName() {
    return name;
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助,

道格

  • EclipseLink的额外映射灵活性非常棒.我也非常喜欢开发人员在外部映射文件中支持XML绑定所做的工作,而不仅仅是通过注释.这允许将域模型映射到多个XSD,版本以及不同的数据源,而不会产生任何混乱 (3认同)