当前位置: 代码迷 >> java >> 处理 JAXB 中的嵌套元素
  详细解决方案

处理 JAXB 中的嵌套元素

热度:70   发布时间:2023-07-31 11:25:47.0

我想知道是否有可能让 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();
    }

}

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

如果你看:

您会注意到 Customer 的名称存储在其中,但该名称是 Customer 的 String 属性。 这是使用以下方法完成的:

@XmlPath("personal-info/name/text()")
public String getName() {
    return name;
}

我希望这有帮助,

道格

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

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

}

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

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