Question Gestion des éléments imbriqués dans JAXB


Je me demande s'il est possible que JAXB ne crée pas d'objet Java pour les éléments XML servant d'enveloppes. Par exemple, pour XML de la structure suivante

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

Je ne veux pas d'objet pour <wrapper> être créé du tout. Donc, pour une classe comme

class Root {
    private Entity entity;
}

la <entity> L'élément doit être désarrangé directement dans le champ d'entité.

Est-il possible de réaliser avec JAXB?


12
2018-06-30 09:33


origine


Réponses:


Bien qu'il nécessite un codage supplémentaire, vous pouvez procéder à un désarchivage en utilisant un objet wrapper transitoire:

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

}

6
2017-07-01 07:40



EclipseLink MOXy propose une implémentation JAXB 2.2 avec des extensions. L'une des fonctionnalités étendues consiste à utiliser XPath pour naviguer dans les couches du XML que vous ne souhaitez pas inclure dans votre modèle de domaine.

Si vous regardez:

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

vous remarquerez que le nom du client est stocké à l'intérieur mais que le nom est un attribut String du client. Ceci est accompli en utilisant:

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

J'espère que ça aide,

Doug


5
2017-07-04 14:30



L'intérêt de JAXB ou d'autres systèmes de cartographie est de mapper les éléments et leur hiérarchie aux classes. Dans votre exemple, vous semblez vouloir que JAXB sache qu'il peut regrouper l'entité dans un wrapper / entité et vice versa sans créer réellement la classe utilisée pour le mappage de wrapper et la connexion entre root et entity. Ce qui, comme présenté, équivaut à peu près à demander comment connecter un moteur de voiture aux roues sans arbre de transmission.

Donc, à moins de manquer ce point, la réponse est non - ni JAXB ni aucun autre programme de cartographie ne peut le faire. Vous pouvez éviter de créer des classes en utilisant quelque chose qui fait du mappage de manière purement dynamique (voir Groovy, GPath pour un exemple), mais cela évite de créer toutes les classes, et pas simplement ignorer un niveau intermédiaire dans une hiérarchie.


-2