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

标签 java xml xstream

我正在尝试将如下 xml 文件转换为 java map 。 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;
    }
}

因此 map 现在仅包含 ID 和 Married 作为键值对。它不会将人口统计父项转换为其相应的名称值对。

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

最佳答案

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

关于java - 使用 xstream 将键值 xml 对映射到 java 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16471738/

相关文章:

java - 是否可以以编程方式创建 ant 构建文件?

java - 如何使用自然顺序和比较器编写函数

java - XStream 短动态别名

java - 带有 xml 和 java 对象的 XStream

java - addView 到 ScrollView 中的线性布局在刷新时被删除

Java:在 new File() 中传递字符串变量

java - 如何使用 ListView 滚动所有布局

xml - Oracle 能否在本地文件系统上使用 XSD 模式验证 XML?

xml - 如何使用 xpath/xquery 从 rss feed 获取图片 url

java - XStream 解析没有根节点的 JSON