Il y a peut être une raison valable pourquoi vous voulez le faire, mais la génération de ce type de XML est généralement à éviter. Pourquoi? Car cela signifie que les éléments XML de votre carte sont dépendants sur le runtime contenu de votre carte. Et comme XML est généralement utilisé comme une interface externe ou de la couche d'interface ce n'est pas souhaitable. Laissez-moi vous expliquer.
Le Schéma Xml (xsd) définit l'interface du contrat de vos documents XML. En plus d'être en mesure de générer le code à partir du fichier XSD, JAXB peut aussi générer un schéma XML pour vous à partir du code. Cela vous permet de limiter la quantité de données échangées via l'interface convenu à l'avance, les structures définies dans le fichier XSD.
Dans le cas par défaut pour un Map<String, String>
, à la génération XSD va restreindre l'élément de carte de contenir plusieurs éléments de saisie qui doivent contenir un xs:string
clé et un xs:string
de la valeur. C'est une jolie interface claire contrat.
Ce que vous décrivez, c'est que vous voulez que le mappage xml contenir des éléments dont le nom sera déterminé par le contenu de la carte au moment de l'exécution. Alors générés XSD peut seulement indiquer que la carte doit contenir une liste des éléments dont le type est inconnu au moment de la compilation. C'est quelque chose que vous devriez éviter lors de la définition d'une interface de contrat.
Pour obtenir un contrat strict dans ce cas, vous devez utiliser un type énuméré comme la clé de la carte au lieu d'une Chaîne. E. g.
public enum KeyType {
KEY, KEY2;
}
@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType , String> mapProperty;
De cette façon, les clés qui vous voulez devenir des éléments XML sont connus au moment de la compilation afin de JAXB devrait être en mesure de générer un schéma qui permettrait de limiter les éléments de la carte pour les éléments à l'aide de l'une des clés prédéfinies de la CLÉ ou de la TOUCHE2.
D'autre part, si vous souhaitez simplifier par défaut généré structure
<map>
<entry>
<key>KEY</key>
<value>VALUE</value>
</entry>
<entry>
<key>KEY2</key>
<value>VALUE2</value>
</entry>
</map>
Pour quelque chose de plus simple comme cela
<map>
<item key="KEY" value="VALUE"/>
<item key="KEY2" value="VALUE2"/>
</map>
Vous pouvez utiliser un MapAdapter qui convertit la Carte à un tableau de MapElements comme suit:
class MapElements {
@XmlAttribute
public String key;
@XmlAttribute
public String value;
private MapElements() {
} //Required by JAXB
public MapElements(String key, String value) {
this.key = key;
this.value = value;
}
}
public class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
public MapAdapter() {
}
public MapElements[] marshal(Map<String, String> arg0) throws Exception {
MapElements[] mapElements = new MapElements[arg0.size()];
int i = 0;
for (Map.Entry<String, String> entry : arg0.entrySet())
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
return mapElements;
}
public Map<String, String> unmarshal(MapElements[] arg0) throws Exception {
Map<String, String> r = new TreeMap<String, String>();
for (MapElements mapelement : arg0)
r.put(mapelement.key, mapelement.value);
return r;
}
}