2012-02-07 152 views
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。

在此先感謝您的任何見解。

回答

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; 
     } 

    } 

} 
+1

這奏效了下面。你可能會給出一些更多的信息,爲什麼它確實能做到這一點?再次感謝! – 2012-02-07 23:35:30

+0

我也對你的代碼工作原理感興趣。我有類似的問題,但無法使其工作。你可以分享一些關於這方面的見解嗎?也許這個問題的作者甚至知道缺少什麼。任何幫助都是適當的。 – 2012-03-18 16:13:02