2011-12-10 5 views
7

Estoy empezando a experimentar con el desarrollo de Android con SimpleXML y pensé que iba bastante bien hasta que me tocó un inconveniente. El código siguiente produce una excepción deExcepción del constructor SimpleXML: no se puede crear la clase interna

W/System.err (665): org.simpleframework.xml.core.ConstructorException: No se puede construir la clase interna

He mirado a través de las preguntas en las clases internas y creo que entiendo por qué las usarías (no es que la mía fuera necesariamente intencional) pero a pesar de mover mi código para intentar evitar el uso, todavía estoy un poco bloqueado y agradecería cualquier ayuda.

Código Fuente:

public class InCaseOfEmergencyMedAlertAllergiesActivity extends Activity { 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 


    Serializer serializer = new Persister(); 
    InputStream xmlstream = this.getResources().openRawResource(R.raw.sample_data_allergies); 
    try { 
     medalertdata allergyObject = serializer.read(medalertdata.class, xmlstream); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    setContentView(R.layout.allergies); 
} 

@Root 
public class medalertdata { 
    @ElementList 
    private List<allergy> allergyList; 

    public List getAllergies() { 
     return allergyList; 
    } 
} 

@Root 
public class allergy{ 

    @Element 
    private String to; 

    @Element 
    private Boolean medical; 

    @Element 
    private String notes; 

    public allergy(String to, Boolean medical, String notes){ 
     this.to = to; 
     this.medical = medical; 
     this.notes = notes; 
    } 

    public String getTo() { 
     return to; 
    } 

    public Boolean getMedical() { 
     return medical; 
    } 

    public String getNotes() { 
     return notes; 
    } 


} 

}

Con el archivo XML referenciado estructurado como:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<medalertdata> 
<allergy> 
    <to>Penicillin</to> 
    <medical>true</medical> 
    <notes></notes> 
</allergy> 
<allergy> 
    <to>Bee Stings</to> 
    <medical>false</medical> 
    <notes>Sample</notes> 
</allergy> 
</medalertdata> 

es el problema con la forma en que he anotado las clases SimpleXML o donde estoy tratando para leerlos? ¡Gracias!

Respuesta

5

Intente eliminar @Root de la clase allergy.

Además, ¿tiene estas dos clases cada una en su archivo separado: allergy.java y medalertdata.java?

+0

Gracias por la respuesta. La eliminación de la notación @Root lamentablemente no tuvo ningún efecto. Actualmente ambas clases se declaran dentro de la clase Activity después de que se haya cerrado onCreate(), ¿deberían estar en diferentes archivos? – Rory

+4

Sí, todas las clases públicas normales en Java deben declararse en su propio archivo. Otra opción sería hacerlos 'estáticos' (no sé cómo SimpleXML maneja esto). –

+2

Tenerlos en el mismo archivo fue definitivamente el problema =) – Rory

12

Me encontré con esto también al leer datos XML profundamente anidados en objetos Java (y querer mantener la estructura de objetos simple definiendo las clases en el mismo archivo).

La solución (que no implica la división en archivos separados) era hacer las clases anidadas estáticas. (En otras palabras, convertir inner classes into static nested classes.) Un poco obvio en retrospectiva.

Ejemplo;
estructura anidada:

// ScoreData 
// Sport 
//  Category 
//  Tournament 

Java:

@Root 
public class ScoreData { 

    @ElementList(entry = "Sport", inline = true) 
    List<Sport> sport; 

    static class Sport { 
     @ElementList(entry = "Category", inline = true) 
     List<Category> category; 
    } 

    // ... 
} 

responsabilidad: Soy consciente de OP tiene el problema ya resuelto, pero tal vez esto ayude a otros que se ejecutan en org.simpleframework.xml.core.ConstructorException: Can not construct inner class y no quieren para definir el clases en archivos separados como Peter's answer sugiere.

+3

Gracias.Esto se siente mucho más limpio que dividir un montón de clases de un solo uso en archivos separados. –

Cuestiones relacionadas