【问题标题】:How to map an Hashmap to key-value-attributes in XML using xstream如何使用 xstream 将 Hashmap 映射到 XML 中的键值属性
【发布时间】:2014-07-12 01:31:25
【问题描述】:

我有以下实体:

@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 做到这一点?我可以使用自定义转换器或映射器或类似的东西吗?蒂亚!!

(当然我的代码需要确保xml属性中没有重复。)

【问题讨论】:

    标签: java xml map xstream


    【解决方案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;
        }
    }
    

    【讨论】:

    • @Emi 你是对的。对我来说,这就足够了。 (但它可以扩展为使用可用的字符串表示来处理其他对象。)
    【解决方案2】:

    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>
    

    【讨论】:

    • 感谢您的回答。不幸的是,这不是我需要的。我需要一个像&lt;entity keyvalue="value"&gt; 这样的xml,所以map-entry 的key 应该是xml-attribute 的名称。
    • 哦,对不起,在这种情况下,我认为唯一的方法是扩展MapConverter
    • 您从提供的链接中获取了 XML 输出示例。但是,XML 仍然无效。如果您删除“条目”后的“>”符号,则有效
    猜你喜欢
    • 2013-05-04
    • 2017-04-08
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2012-09-16
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多