0

从下面的简单 XML 中,我想创建一个带有Field实例集合的SomeApplication实例,其中每个Field实例代表 <some-application> 的一个子元素。Field实例将有两个字符串属性,名称和值,它们分别从节点名称和节点值分配。

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

将字段元素(<some-application> 的子元素)转换为Field实例的最佳策略是什么?

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

提前致谢。

4

1 回答 1

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;
    }
于 2012-07-19T08:00:23.800 回答