Может быть веская причина, почему вы хотите это сделать, но генерацию такого рода XML, как правило, лучше избегать.Зачем?Потому что это означает, что элементы XML вашей карты зависят от содержимого вашей карты во время выполнения.А поскольку XML обычно используется как внешний интерфейс или интерфейсный уровень, это нежелательно.Позвольте мне объяснить.
Схема Xml (xsd) определяет контрактный интерфейс ваших документов XML.Помимо возможности генерировать код из XSD, JAXB также может генерировать для вас XML-схему из кода.Это позволяет ограничить обмен данными по интерфейсу с предварительно согласованными структурами, определенными в XSD.
В случае по умолчанию для Map<String, String>
сгенерированный XSD ограничит элемент карты несколькими записями.элементы, каждый из которых должен содержать один ключ xs:string
и одно значение xs:string
.Это довольно четкий интерфейсный контракт.
Вы описываете, что хотите, чтобы карта xml содержала элементы, имя которых будет определяться содержимым карты во время выполнения.Тогда сгенерированный XSD может только указать, что карта должна содержать список элементов, тип которых неизвестен во время компиляции.Этого следует избегать при определении контракта интерфейса.
Для достижения строгого контракта в этом случае следует использовать перечислимый тип в качестве ключа карты вместо строки.Например,
public enum KeyType {
KEY, KEY2;
}
@XmlJavaTypeAdapter(MapAdapter.class)
Map<KeyType , String> mapProperty;
Таким образом, ключи, которые вы хотите стать элементами в XML, известны во время компиляции, поэтому JAXB должен иметь возможность генерировать схему, которая ограничит элементы карты элементами, используя один из предопределенныхключи KEY или KEY2.
С другой стороны, если вы хотите упростить сгенерированную по умолчанию структуру
<map>
<entry>
<key>KEY</key>
<value>VALUE</value>
</entry>
<entry>
<key>KEY2</key>
<value>VALUE2</value>
</entry>
</map>
К чему-то более простому, как это
<map>
<item key="KEY" value="VALUE"/>
<item key="KEY2" value="VALUE2"/>
</map>
Вы можетеиспользуйте MapAdapter, который преобразует карту в массив элементов Map следующим образом:
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;
}
}