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 に答える