我正在尝试使用 JAXB 和 @XmlJavaTypeAdaptor 在编码期间映射 Map。我遇到的唯一问题是用于包含 map 中每个条目的“item”元素被赋予了一个空白 namespace 。
下面是一个生成的 XML 文档示例,显示了该问题:
<format xmlns="myNamespace">
<data>
<item xmlns:ns2="myNamespace" xmlns="">
<ns2:key>Admin</ns2:key>
<ns2:value>John</ns2:value>
</item>
</data>
</format>
我希望片段看起来像这样:
<format xmlns="myNamespace">
<data>
<item>
<key>Admin</key>
<value>John</value>
</item>
</data>
</format>
我简化了现实生活中的示例,将其范围缩小到仅此情况。这是正在编码的类:
@XmlRootElement(name = "format")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public final class Format {
@XmlTransient
private final Map<String, String> data = new HashMap<String, String>();
@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, String> getData() {
return data;
}
}
这是我正在使用的 XmlAdapter 的实现:
public class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
@Override
public MapElements[] marshal(Map<String, String> stringStringMap) throws Exception {
MapElements[] mapElements = new MapElements[stringStringMap.size()];
int i = 0;
for (Map.Entry<String, String> entry: stringStringMap.entrySet()) {
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
}
return mapElements;
}
@Override
public Map<String, String> unmarshal(MapElements[] mapElements) throws Exception {
Map<String, String> map = new HashMap<String, String>();
for (MapElements mapElement : mapElements) {
map.put(mapElement.key, mapElement.value);
}
return map;
}
}
我像这样设置包级别信息,这确实有帮助,因为它确保除“item”元素之外的所有元素的命名空间都具有命名空间“myNamespace”:
@XmlSchema(namespace = "myNamespace", elementFormDefault = XmlNsForm.QUALIFIED)
package org.prystasj;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
我尝试了注释的每种组合,例如@XmlElement(namespace="myNamespace"),我可以想到整个过程,但没有机会,所以我认为我错过了一些概念性的东西(或者甚至可能是一些相当微不足道的东西)。
我正在使用 JAXB 2.2.2。
预先感谢您的任何见解。
最佳答案
您可以将以下内容用于您的XmlAdapter
import java.util.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class MapAdapter extends XmlAdapter<MapAdapter.MapElements, Map<String, String>> {
@Override
public MapElements marshal(Map<String, String> stringStringMap) throws Exception {
MapElements mapElements = new MapElements();
for (Map.Entry<String, String> entry: stringStringMap.entrySet()) {
mapElements.item.add(new MapElement(entry.getKey(), entry.getValue()));
}
return mapElements;
}
@Override
public Map<String, String> unmarshal(MapElements mapElements) throws Exception {
Map<String, String> map = new HashMap<String, String>();
for (MapElement mapElement : mapElements.item) {
map.put(mapElement.key, mapElement.value);
}
return map;
}
public static class MapElements {
public List<MapElement> item = new ArrayList<MapElement>();
}
public static class MapElement {
public String key;
public String value;
public MapElement() {
}
public MapElement(String key, String value) {
this.key = key;
this.value = value;
}
}
}
关于java - 使用 @XmlJavaTypeAdapter 映射 Map 时的 JAXB 和空命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9181191/