2012-04-09 11 views
2

ich versucht haben, eine XML mit der simplexml Bibliothek (v2.6.2) http://simple.sourceforge.net/home.phpSimpleXML Enum Fall-Empfindlichkeit

erstellen

Die XML-I erstellt werden soll hat einen Enum-Wert zu halten, der Fall empfindlich sein sollte . Im Folgenden ist der 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); 
     } 

} 

folgenden wird der Serialisierer-Code:

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

    } 

} 

Die resultierende Ausgabe:

<myEnum>NEW</myEnum> 

Der gewünschte Ausgang:

<myEnum>new</myEnum> 

Wie nehme ich Vorgehen ? Ich kann den Variablennamen in der Enum nicht ändern, da es zufällig das Schlüsselwort "neu" ist!

Danke.

Antwort

11

Nach einiger Untersuchung des Quellcodes habe ich entdeckt, dass die Bibliothek die Schnittstelle Transform verwendet, um Werte in Strings zu transformieren. Das Standardverhalten von Enum-Transformationen ist durch die Klasse EnumTransform definiert. Um das anzupassen, können Sie Ihre eigene Transform-Klasse definieren. Die folgende Version der Transform Implementierung würde toString() anstelle des Standards name() für die Enum-Objekte aufrufen.

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 Objekte werden aus match Verfahren nach Objekten Matcher Schnittstelle zurückgegeben. Es könnte mehrere Matcher Objekte geben. Die Bibliothek probiert sie nacheinander aus, bis sie ein Objekt findet, das ein Transformer Objekt zurückgibt. Sie können Ihr eigenes Objekt Matcher definieren und es als Argument an den Konstruktor der Klasse Persister übergeben. Dieses Objekt erhält die höchste Priorität.

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

Schließlich vergessen Sie nicht, eine toString-Methode für Ihre Enum-Klassen zu definieren. Dann führt die obige Kombination von Codes die Enkodierung von Enum-Objekten mit ihren toString-Werten aus.

+0

versucht mit diesem Code schreiben: public String toString() \t { \t \t Rückkehr this.value.toLowerCase(); \t \t \t} – zombie

+0

Zwingende gemäß den obigen Code funktioniert nicht, es noch „NEW“ zeigt und nicht als „neue“ – zombie

+0

@zombie ich habe meine Antwort überarbeitet. Ich denke, diesmal ist es wirklich das, was du erwartest. – weidi

0

Ich würde mir die serializer code ansehen und verstehen, was das tut, wie Sie keine Ihrer Felder kommentiert haben ... die (nach ihren Dokumenten) eine Ausnahme auslösen sollten.

0

sollten Sie außer Kraft setzen toString()

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

Dann Ergebnisse

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

Funktioniert nicht :(Das XML zeigt immer noch NEW – zombie

+0

Versuchen Sie es mit serializer.write (example.toString(), Ergebnis); Ich habe die Antwort aktualisiert –

+0

Danke dafür – zombie