如何使用XStream将XML节点中的不同子XML元素转换为通用java类型实例?
在下面的简单XML中,我想创建一个SomeApplication的实例,其中包含一组字段实例,其中每个字段实例表示一个子元素。字段实例将具有两个字符串属性,名称和值,分别从节点名称和节点值分配 XML输入:如何使用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 {
<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;
}