2014-05-22 30 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