如何使用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;
}