【问题标题】:Deserialising to a map key-value pairs provided as XML attributes (Java)反序列化为作为 XML 属性 (Java) 提供的映射键值对
【发布时间】:2015-12-07 15:26:39
【问题描述】:

我想要这个 XML

<root>

  <firstTag>
    <property key="foo" value="One"/>
    <property key="bar" value="Two"/>
  </firstTag>

  <secondTag>
    <property key="foo" value="1"/>
    <property key="bar" value="2"/>
  </secondTag>

</root>

要反序列化为Map&lt;String, String&gt;,这样只有通过&lt;firstTag/&gt; 中的属性提供的键和值才会被考虑在内。 这是所需的输出映射:

{foo=One, bar=Two}

这使用 XStream、jackson-dataformat-xml 或任何流行的解组库。

【问题讨论】:

  • XStream 或 Jackson 非常适合这项工作。那么你的问题是什么?
  • 问题是:如何用 XStream 做到这一点?

标签: java xml xstream xml-deserialization


【解决方案1】:

我需要为此实现Converter

public class MyConverter implements Converter {

    public boolean canConvert(Class clazz) {
        return AbstractMap.class.isAssignableFrom(clazz);
    }

    @Override
    public void marshal(Object arg0, HierarchicalStreamWriter writer, MarshallingContext context) {}

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {

        Map<String, String> map = new HashMap<String, String>();
        reader.moveDown();  // Get down to the firstTag and secondTag level.

        while(reader.hasMoreChildren()) {
            if(reader.getNodeName().equals("firstTag")) {
                while(reader.hasMoreChildren()) {
                    reader.moveDown();
                    String key = reader.getAttribute("key");
                    String value = reader.getAttribute("value");
                    map.put(key, value);
                    reader.moveUp();
                }
            }
        }
        return map;
    }
}

然后使用它:

XStream xstream = new XStream();
xstream.alias("root", java.util.Map.class);
xstream.registerConverter(new MyConverter());

String xml = ...
Map<String, String> map = (Map<String, String>) xstream.fromXML(xml);

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多