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

问题描述:

从我简单的XML下面,我想创建SomeApplication的实例与实例的集合,其中每个实例来表示的<一些应用>一个子元素。 字段实例将具有两个字符串属性,分​​别从节点名称和节点值分配的名称和值。如何使用XStream将XML节点中的不同子XML元素转换为通用Java类型实例?

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

什么是转换域元素(的<给孩子一些应用>)至场的最佳策略实例?

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

在此先感谢。

我设法实现它使用自定义转换器 - 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; 
    }