2
我试图在编组期间使用JAXB和@XmlJavaTypeAdaptor映射映射。我遇到的唯一问题是用于包含地图中每个条目的“item”元素被赋予一个空白的命名空间。使用@XmlJavaTypeAdapter映射映射时的JAXB和空名称空间
下面是生成的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>
我simplifed现实生活中的例子来缩小到这种情况。这里是正在整理类:
@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;
}
}
我设置像这样的包级别信息,这确实帮助,因为它确保了命名空间除“项目”元素的元素都有命名空间“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。
在此先感谢您的任何见解。
这奏效了下面。你可能会给出一些更多的信息,为什么它确实能做到这一点?再次感谢! – 2012-02-07 23:35:30
我也对你的代码工作原理感兴趣。我有类似的问题,但无法使其工作。你可以分享一些关于这方面的见解吗?也许这个问题的作者甚至知道缺少什么。任何帮助都是适当的。 – 2012-03-18 16:13:02