0

以下の単純な XML から、各Fieldインスタンスが <some-application> の子要素を表すFieldインスタンスのコレクションを持つSomeApplicationのインスタンスを作成したいと考えています。Fieldインスタンスには、ノード名とノード値からそれぞれ割り当てられる name と value の 2 つの String プロパティがあります。

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 に答える