处理JAXB中的嵌套元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理JAXB中的嵌套元素相关的知识,希望对你有一定的参考价值。

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

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

我不想要创建<wrapper>的对象。所以对于像这样的课程

class Root {
    private Entity entity;
}

<entity>元素应该直接解组到实体字段中。

是否可以使用JAXB实现?

答案

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

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

}
另一答案

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

我希望这有帮助,

道格

另一答案

JAXB或其他映射系统的重点是将元素及其层次结构映射到类。在您的示例中,您似乎希望JAXB以某种方式知道它可以将实体编组为包装器/实体,反之亦然,而不实际创建用于包装器映射的类以及根和实体之间的连接。如图所示,其大致相当于询问如何在没有传动轴的情况下将汽车发动机连接到车轮。

因此,除非我忽略了这一点,否则答案是否定的 - JAXB或任何其他映射程序都无法做到这一点。您可以通过使用纯动态映射的东西来避免创建类(请参阅Groovy,GPath作为示例),但这样可以避免创建所有类,而不仅仅是跳过层次结构中的一个中间级别。

以上是关于处理JAXB中的嵌套元素的主要内容,如果未能解决你的问题,请参考以下文章

共享元素转换:活动到嵌套在另一个活动中的片段

带有元素引用的 JAXB 多个模式

共享元素转换在父片段和子片段之间不起作用(嵌套片段)

JAXB 编组:更改应声明命名空间的元素

JAXB - 忽略元素

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用