2014-05-22 28 views
3

映射一個HashMap來在XML鍵 - 值屬性我有以下實體:如何使用XStream的

@XStreamAlias("entity") 
public class MapTestEntity { 

    @XStreamAsAttribute 
    public Map<String, String> myMap = new HashMap<>(); 

    @XStreamAsAttribute 
    public String myText; 
} 

我使用XStream使用它像:

MapTestEntity e = new MapTestEntity(); 
e.myText = "Foo"; 
e.myMap.put("firstname", "homer"); 
e.myMap.put("lastname", "simpson"); 

XStream xstream = new XStream(new PureJavaReflectionProvider()); 
xstream.processAnnotations(MapTestEntity.class); 
System.out.println(xstream.toXML(e)); 

,並得到下面的XML :

<entity myText="Foo"> 
    <myMap> 
    <entry> 
     <string>lastname</string> 
     <string>simpson</string> 
    </entry> 
    <entry> 
     <string>firstname</string> 
     <string>homer</string> 
    </entry> 
    </myMap> 
</entity> 

但我需要的HashMap映射到屬性的XML,如:

<entity myText="Foo" lastname="simpson" firstname="homer" /> 

我該如何做到這一點與XStream?我可以使用自定義轉換器或映射器或類似的東西嗎? TIA!

(當然我的代碼必須確保在XML屬性沒有重複。)

回答

1

我寫了自己的轉換器:

public class MapToAttributesConverter implements Converter { 

    public MapToAttributesConverter() { 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return Map.class.isAssignableFrom(type); 
    } 

    @Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
     Map<String, String> map = (Map<String, String>) source; 
     for (Map.Entry<String, String> entry : map.entrySet()) { 
      writer.addAttribute(entry.getKey(), entry.getValue().toString()); 
     } 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
     Map<String, String> map = new HashMap<String, String>(); 
     for (int i = 0; i < reader.getAttributeCount(); i++) { 
      String key = reader.getAttributeName(i); 
      String value = reader.getAttribute(key); 
      map.put(key, value); 
     } 
     return map; 
    } 
} 
+0

它只能與Map 一起使用,是嗎? – Emi

+0

@Emi你是對的。對我來說這就足夠了。 (但它可能會擴展爲使用可用的字符串表示法處理其他對象。) – t777

1

NamedMapConverter可以實現這一點。看看http://x-stream.github.io/javadoc/com/thoughtworks/xstream/converters/extended/NamedMapConverter.html

第三個例子正好說明了這一點,你想要什麼:

new NamedMapConverter(xstream.getMapper(), "entry", "key", String.class, "value", Integer.class, true, true, xstream.getConverterLookup()); 

創建XML輸出:

<map> 
     <entry key="keyValue" value="0"/> 
    </map> 
+0

感謝您的回答。不幸的是,這不是我所需要的。我需要像''這樣的結果xml,所以map-entry的關鍵字應該是xml-attribute的名稱。 – t777

+1

對不起,在這種情況下,我認爲唯一的方法是擴展'MapConverter' – Vertex

+0

您從您提供的鏈接中獲取了XML輸出示例。但是,XML仍然無效。如果您在「輸入」後刪除'>'符號,那麼這將是有效的 – OneWorld