代码之家  ›  专栏  ›  技术社区  ›  ᄂ ᄀ

在JAXB中处理嵌套元素

  •  12
  • ᄂ ᄀ  · 技术社区  · 14 年前

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

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

    我不想要一个对象 <wrapper> 完全可以创建。所以对于一个像

    class Root {
        private Entity entity;
    }
    

    这个 <entity> 元素应直接解编到实体字段中。

    有没有可能用JAXB实现?

    3 回复  |  直到 6 年前
        1
  •  6
  •   ᄂ ᄀ    6 年前

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

    @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();
        }
    
    }
    
        2
  •  5
  •   Doug Clarke    14 年前

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

    如果你看:

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

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

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

    希望这有帮助,

    道格

        3
  •  -3
  •   Stewart Buskirk    14 年前

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

    所以,除非我遗漏了这一点,否则答案是否定的——JAXB或任何其他映射程序都不能做到这一点。您可以通过使用完全动态映射的方法来避免创建类(例如,请参阅groovy、gpath),但这样可以避免创建所有类,而不仅仅是跳过层次结构中的一个中间级别。