<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<meineEntitaet>
<paarliste>
<paar>
<schluessel>Antwort</schluessel>
<wert>42</wert>
</paar>
</paarliste>
</meineEntitaet>
Dazu benötigen wir als Erstes für einen einzelnen Eintrag der Map (also für jedes Schlüssel-Wert-Paar) folgende Klasse:import javax.xml.bind.annotation.XmlElement;
class MapElement {
@XmlElement(name = "schluessel")
String key;
@XmlElement(name = "wert")
Integer value;
MapElement() {
}
MapElement(String key, Integer value) {
this.key = key;
this.value = value;
}
}
Die Liste der Map-Einträge wird in einer eigenen Klasse verpackt, damit wir den Namen des XML-Elements festlegen können, das die einzelnen Schlüssel-Wert-Paare umschließt:
class MapElements {
@XmlElement(name = "paar")
List<MapElement> mapElements;
MapElements() {
}
MapElements(List<MapElement> mapElements) {
this.mapElements = mapElements;
}
}
In der JAXB-Entität taucht nun aber nicht diese MapElements-Klasse auf, sondern die ursprünglich gewünschte (Hash)Map:
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MeineEntitaet {
@XmlElement(name = "paarliste")
@XmlJavaTypeAdapter(MapAdapter.class)
private Map<String, Integer> map = new HashMap<>();
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
}
Für die Umwandlung zwischen der MapElements-Klasse und der HashMap benötigen wir einen XmlAdapter:
import java.util.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class MapAdapter extends XmlAdapter<MapElements, Map<String, Integer>> {
@Override
public MapElements marshal(Map<String, Integer> map) {
List<MapElement> list = new ArrayList<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
list.add(new MapElement(entry.getKey(), entry.getValue()));
}
return new MapElements(list);
}
@Override
public Map<String, Integer> unmarshal(MapElements elements) {
Map<String, Integer> map = new HashMap<>();
for (MapElement mapElement : elements.mapElements) {
map.put(mapElement.key, mapElement.value);
}
return map;
}
}
Damit können wir schließlich das XML-Dokument erzeugen:
MeineEntitaet huelle = new MeineEntitaet();
huelle.getMap().put("Antwort", 42);
JAXB.marshal(huelle, System.out);
