Maison >Java >javaDidacticiel >Comment transformer une carte en structure XML « valeur » avec JAXB ?
JAXB : regrouper une carte en
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
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
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!