Handling nested elements in JAXB

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


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

}

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

}