如何使用XStream将不同的子XML元素从XML节点转换为通用的Java类型实例?

时间:2012-07-18 06:00:50

标签: java xml xstream

从下面的简单XML中,我想创建一个 SomeApplication 的实例,其中包含 Field 实例的集合,其中每个 Field 实例代表< some-application>的子元素。 Field 实例将具有两个String属性,name和value,分别从节点名称和节点值分配。

XML输入:

<some-application>
    <field1>foo</field1>
    <field2>bar</field2>
</some-application>

Java类型:

public class Field {

    private String name;   
    private String value;

    public Field(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName(){
        return name;
    }

    public String getValue(){
        return value;
    }
}

public class SomeApplication {

    private List<Field> fields;

    public SomeApplication(){
        fields = new ArrayList<Field>();
    }

    public void addField(Field field){
        fields.add(field);
    }
}

将字段元素(&lt; some-application&gt;的子元素)转换为 Field 实例的最佳策略是什么?

请注意,为简洁起见,我简化了要求。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我设法使用自定义转换器实现它 - SomeApplicationConverter 。在我的自定义转换器中,在解组时,对于我遇到的每个子节点,我使用节点名称和值创建 Field 类型实例。以下是我的自定义转换器

public class SomeApplicationConverter implements Converter {

    @Override
    @SuppressWarnings("unchecked")
    public boolean canConvert(Class type) {
        if (type.equals(SomeApplication.class)) {
            return true;
        }
        return false;
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer,
            MarshallingContext context) {
        throw new UnsupportedOperationException(
                "Marshalling is not supported yet");
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        SomeApplication application = new SomeApplication();
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            String name = reader.getNodeName();
            String value = reader.getValue();
            Field field = new Field(name, value);
            application.addField(field);
            reader.moveUp();
        }
        return application;
    }