4

simplexml ライブラリ (v2.6.2) http://simple.sourceforge.net/home.phpを使用して XML を作成しようとしています。

作成したい XML は、大文字と小文字を区別する必要がある列挙値を保持する必要があります。以下はPOJOです:

 package pojos;

public enum MyEnum {

    NEW("new"),
    OLD("old");

     private final String value;

     MyEnum(String v)
     {
         value = v;
     }

     public String value() {
            return value;
        }

        public static MyEnum fromValue(String v) {
            for (MyEnum c: MyEnum.values()) {
                if (c.value.equals(v)) {
                    return c;
                }
            }
            throw new IllegalArgumentException(v);
        }

}

以下はシリアライザーコードです:

import java.io.File;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

import pojos.MyEnum;


public class TestEnum {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub

        Serializer serializer = new Persister();
        MyEnum example = MyEnum.NEW;
        File result = new File("myenum.xml");

        serializer.write(example, result);

    }

}

結果の出力:

<myEnum>NEW</myEnum>

望ましい出力:

<myEnum>new</myEnum>

どうすればよいですか?たまたまキーワード「new」であるため、列挙型の変数名を変更できません!

ありがとう。

4

3 に答える 3

14

ソース コードを調査した結果、ライブラリがインターフェイスTransformを使用して値を文字列に変換していることを発見しました。enum 変換のデフォルトの動作は、 class によって定義されEnumTransformます。それをカスタマイズするために、独自の Transform クラスを定義できます。次のバージョンのTransform実装は、enum オブジェクトtoString()のデフォルトの代わりに呼び出します。name()

class MyEnumTransform implements Transform<Enum> {
    private final Class type;

    public MyEnumTransform(Class type) {
        this.type = type;
    }

    public Enum read(String value) throws Exception {
        for (Object o : type.getEnumConstants()) {
            if (o.toString().equals(value)) {
                return (Enum) o;
            }
        }
        return null;
    }

    public String write(Enum value) throws Exception {
        return value.toString();
    }
}

Transformオブジェクトは、インターフェイスmatchのオブジェクトによってメソッドから返されます。複数のオブジェクトMatcherが存在する可能性があります。Matcherライブラリは、null 以外のオブジェクトを返すオブジェクトが見つかるまで、それらを 1 つずつ試行しTransformerます。独自のオブジェクトを定義し、クラスMatcherのコンストラクターに引数として渡すことができます。Persisterこのオブジェクトは最高の優先度を取得します。

Persister serializer = new Persister(new Matcher() {
    public Transform match(Class type) throws Exception {
        if (type.isEnum()) {
            return new MyEnumTransform(type);
        }
        return null;
    }
 });

最後に、列挙型クラスで toString メソッドを定義することを忘れないでください。次に、上記のコードの組み合わせにより、toString 値を使用して enum オブジェクトをエンコードする作業が行われます。

于 2012-04-09T07:04:31.233 に答える
1

オーバーライドする必要がありますtoString()

@Override 
public String toString() {
       return this.value.toLowerCase();
}

次に、を使用して結果を書き込みます

serializer.write(example.toString(), result);
于 2012-04-09T07:12:39.123 に答える
0

フィールドに注釈を付けていないため、シリアライザーコードを見て、それが何をしているのか理解できません...(ドキュメントによると)例外をスローする必要があります。

于 2012-04-09T07:02:22.950 に答える