java - 使用 @XmlJavaTypeAdapter 映射 Map 时的 JAXB 和空命名空间

标签 java xml data-binding jaxb

我正在尝试使用 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/

相关文章:

Java Web Start - 访问 jnlp 中的环境变量 java.io.tmpdir

java - 正则表达式挂起 - Java 匹配器

javascript - 在 XML 文档中搜索某个元素/属性值并返回该元素

python-3.x - 如何在Python中为数据框的每一行创建唯一的XML

c# - WPF DataTemplate 绑定(bind)取决于属性的类型

java - 静态最终 int v/s 静态 int

java - 带 am/pm 的日期对象的格式

python - 我如何在 Python 应用程序之上创建一个 GUI,以便它可以执行 GUI 或 CLI?

c# - 空工具提示问题

wpf - 超链接不能与相关命令一起正常工作