Maison >Java >javaDidacticiel >Comment transformer une carte en structure XML « valeur » avec JAXB ?

Comment transformer une carte en structure XML « valeur » avec JAXB ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-18 02:48:02928parcourir

How to Marshall a Map into `value` XML Structure with JAXB?

JAXB : regrouper une carte en value

Alors que JAXB prend en charge nativement le regroupement d'une carte en structures XML telles que :

<map>
  <entry>
    <key> KEY </key>
    <value> VALUE </value>
  </entry>
  <entry>
    <key> KEY2 </key>
    <value> VALUE2 </value>
  </entry>
  ...
</map>

Vous pouvez avoir besoin d'une structure XML où la clé est le nom de l'élément et la valeur est son contenu :

<map>
  <key> VALUE </key>
  <key2> VALUE2 </key2>
 ...
</map>

Recommandation contre la structure XML personnalisée

La génération de XML avec des noms d'éléments dynamiques est généralement déconseillée. Les schémas XML (XSD) définissent les contrats d'interface. JAXB peut générer des XSD à partir du code, vous permettant de restreindre les données échangées selon des structures prédéfinies dans les XSD.

Dans le cas par défaut, un Map générera un XSD restreignant les éléments de la carte pour contenir les clés et les valeurs xs:string. Cela garantit un contrat d'interface clair.

Votre approche générerait un XSD spécifiant que la carte contient des éléments de types inconnus, ce qui viole les bonnes pratiques.

Solution clé d'énumération

Pour faire respecter un contrat strict, envisagez d'utiliser un type énuméré comme clé de carte au lieu d'un String :

public enum KeyType {
    KEY, KEY2;
}

@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType, String> mapProperty;

JAXB générera un schéma limitant les éléments de la carte aux éléments utilisant les clés prédéfinies KEY ou KEY2.

Simplification de la structure par défaut

Si vous préférez la structure XML plus simple de éléments, vous pouvez utiliser un MapAdapter qui convertit la carte en un tableau de MapElements :

class MapElements {
    @XmlAttribute public String key;
    @XmlAttribute public String value;
}

class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
    public MapElements[] marshal(Map<String, String> arg0) {
        MapElements[] mapElements = new MapElements[arg0.size()];
        int i = 0;
        for (var entry : arg0.entrySet())
            mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
        return mapElements;
    }
    public Map<String, String> unmarshal(MapElements[] arg0) {
        Map<String, String> r = new TreeMap<>();
        for (MapElements mapelement : arg0)
            r.put(mapelement.key, mapelement.value);
        return r;
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn