从下面的简单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 实例的最佳策略是什么?
请注意,为简洁起见,我简化了要求。
提前致谢。
答案 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;
}