2012-04-09 13 views
2
私はSimpleXMLのライブラリを使用してXMLを作成しようとしている

私が作成したいXMLは大文字と小文字を区別する必要があります列挙型の値を保持するために持ってい http://simple.sourceforge.net/home.phpSimpleXMLを列挙大文字と小文字の区別

(v2.6.2) 。 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"というキーワードに変更することはできません!

ありがとうございました。

答えて

11

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

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

オブジェクトはMatcherインターフェースのオブジェクトによってmatchメソッドから返されます。いくつかのオブジェクトがあります。Matcherライブラリはヌル以外のTransformerオブジェクトを返すライブラリが見つかるまで、それらを1つずつ試します。独自の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オブジェクトをエンコードする作業を行います。

+0

使用して結果を書き込むそしてtoString()

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

をオーバーライドする必要があります:パブリック文字列のtoString() \t { \t \tリターンthis.value.toLowerCaseを();上記のコードごとにオーバーライド \t \t \t} – zombie

+0

が動作していない、それはまだかなり私は私の答えを修正した「新」 – zombie

+0

@zombieより「NEW」を示しています。今回は本当にあなたが期待していることをすると思います。 – weidi

0

私はserializer codeを見て、あなたのフィールドに注釈を付けていないので、それが何をしているのかを知ることができます。(ドキュメントに応じて)例外をスローする必要があります。

0

このコード試み

serializer.write(example.toString(), result); 
+0

XMLはまだ新しく表示されます – zombie

+0

serializer.write(example.toString ()、result); 回答を更新しました –

+0

ありがとうございました! – zombie

関連する問題