Handling nested elements in JAXB

前端 未结 4 810
梦毁少年i
梦毁少年i 2021-02-05 12:48

I am wondering if it is possible to have JAXB not to create Java object for XML elements that serve as wrappers. For example, for XML of the following structure

         


        
相关标签:
4条回答
  • 2021-02-05 13:03

    The whole point of JAXB or other mapping systems is to map the elements and their hierarchy to classes. In your example, you seem to want JAXB to somehow know that it can marshal entity into wrapper/entity and vice-versa without actually creating the class used for the wrapper mapping and the connection between root and entity. Which, as presented, is roughly equivalent to asking how to connect a car engine to the wheels without a driveshaft.

    So, unless I am missing the point, the answer is no - neither JAXB or any other mapping program can do this. You can avoid creating classes by using something that does mapping purely dynamically (see Groovy, GPath for an example), but that avoids creating all classes, not just skipping one intermediate level in a hierarchy.

    0 讨论(0)
  • 2021-02-05 13:20

    Although it requires extra coding, the desired unmarshalling is accomplished in the following way using a transient wrapper object:

    @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();
        }
    
    }
    
    0 讨论(0)
  • 2021-02-05 13:24

    Worth mentioning, if the content is a list of <entity/> instead of a single instance:

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

    then you can use the @XmlElementWrapper annotation:

    @XmlRootElement(name = "root")
    public class Root {
    
        @XmlElementWrapper(name = "wrapper")
        @XmlElement(name = "entity")
        private List<Entity> entity;
    
        static class Entity { }
    
    }
    
    0 讨论(0)
  • 2021-02-05 13:27

    EclipseLink MOXy offers a JAXB 2.2 implementation with extensions. One of the extended capabilities is to use XPath to navigate through layers of the XML you don't want in you domain model.

    If you look at:

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

    you will notice that the Customer's name is stored within but that the name is a String attribute of Customer. This is accomplished using:

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

    I hope this helps,

    Doug

    0 讨论(0)
提交回复
热议问题