2012-07-18 76 views
0

從我簡單的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); 
    } 
} 

什麼是轉換域元素(的<給孩子一些應用>)至場的最佳策略實例?

請注意,爲了簡潔起見,我簡化了要求。

在此先感謝。

回答

0

我設法實現它使用自定義轉換器 - 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; 
    } 
相關問題