有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用xstream将键值xml对映射到java映射

我正在尝试将一个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和键-值对。它不会将人口统计父对象转换为相应的名称-值对

我希望所有的标记名都作为键,它们的值作为映射值


共 (1) 个答案

  1. # 1 楼答案

    使用MarshallingContext上的convertAnother方法来处理数据的层次结构,例如:

    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;
        }
    }