2

我正在尝试将如下的 xml 文件转换为 java 映射。 xml

<Person>
   <ID>123</ID>
   <Demographics>
   <LastName>ABC</LastName>
   <FirstName>XYZ</FirstName>
   </Demographics>
   <Married>YES</Married>
</Person>

XStream 代码如下:

    final XStream xstream = new XStream();
    xstream.alias("Person", Map.class);
    xstream.alias("Demographics", Map.class);
    xstream.registerConverter(new MapEntryConverter());

    final Map<String, Object> map2 = (Map<String, Object>) xstream.fromXML(xml);//where xml is above defined string.

自定义 MapEntryConverter 是:

public class MapEntryConverter implements Converter
{
    public boolean canConvert(final Class clazz)
    {
        return AbstractMap.class.isAssignableFrom(clazz);
    }

    public void marshal(final Object value, final HierarchicalStreamWriter writer, final MarshallingContext context)
    {
        final AbstractMap<String, String> map = (AbstractMap<String, String>) value;
        for (final Entry<String, String> entry : map.entrySet())
        {
            writer.startNode(entry.getKey().toString());
            writer.setValue(entry.getValue().toString());
            writer.endNode();
        }
    }

    public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context)
    {
        final Map<String, String> map = new HashMap<String, String>();
        while (reader.hasMoreChildren())
        {
            reader.moveDown();
            map.put(reader.getNodeName(), reader.getValue());
            reader.moveUp();
        }
        return map;
    }
}

所以地图现在只包含 ID 和 Married 作为键值对。它没有将 Demographics 父级转换为其相应的名称值对。

我想将所有标签名称作为键,将它们的值作为映射值。

4

1 回答 1

2

利用 上的convertAnother方法MarshallingContext来处理数据的分层性质,例如:

public class MapEntryConverter implements Converter {

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

    public void marshal(final Object value, final HierarchicalStreamWriter writer, final MarshallingContext context) {
        Map<String, Object> map = (Map<String, Object>) value;
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (entry.getValue() instanceof Map) {
                writer.startNode(entry.getKey());
                context.convertAnother(entry.getValue());
                writer.endNode();
            } else {
                writer.startNode(entry.getKey());
                writer.setValue(entry.getValue().toString());
                writer.endNode();
            }
        }
    }

    public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {
        Map<String, Object> map = new HashMap<String, Object>();
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            if (reader.hasMoreChildren()) {
                Map<String, Object> childMap = (Map<String, Object>) context.convertAnother(new HashMap<String, Object>(), Map.class);
                map.put(reader.getNodeName(), childMap);
            } else {
                map.put(reader.getNodeName(), reader.getValue());
            }

            reader.moveUp();
        }
        return map;
    }
}
于 2013-08-04T13:30:24.407 回答