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

如何使用XStream将XML节点中的不同子XML元素转换为通用java类型实例?,java,xml,xstream,Java,Xml,Xstream,在下面的简单XML中,我想创建一个SomeApplication的实例,其中包含一组字段实例,其中每个字段实例表示一个子元素。字段实例将具有两个字符串属性,名称和值,分别从节点名称和节点值分配 XML输入: <some-application> <field1>foo</field1> <field2>bar</field2> </some-application> public class Field {

在下面的简单XML中,我想创建一个SomeApplication的实例,其中包含一组字段实例,其中每个字段实例表示一个子元素。字段实例将具有两个字符串属性,名称和值,分别从节点名称和节点值分配

XML输入:

<some-application>
    <field1>foo</field1>
    <field2>bar</field2>
</some-application>
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);
    }
}

福
酒吧
Java类型:

<some-application>
    <field1>foo</field1>
    <field2>bar</field2>
</some-application>
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);
    }
}
公共类字段{
私有字符串名称;
私有字符串值;
公共字段(字符串名称、字符串值){
this.name=名称;
这个值=值;
}
公共字符串getName(){
返回名称;
}
公共字符串getValue(){
返回值;
}
}
公共类应用程序{
私有列表字段;
公共应用程序(){
字段=新的ArrayList();
}
公共无效添加字段(字段){
字段。添加(字段);
}
}
将字段元素(的子元素)转换为字段实例的最佳策略是什么

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


提前感谢。

我已经通过一个定制的converter-SomeApplicationConverter实现了它。在自定义转换器中,在解组时,对于遇到的每个子节点,我使用节点名称和值创建字段类型实例。下面是我的自定义转换器

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