2011-08-09 14 views
10

que tienen esta estructura de datos:Android, simple-xml, ¿cómo declarar una lista de elementos?

<estates version="0.1"> 

<provider name="Foo"> 
    <estate id="12345678"> 
    <description>aaa</description> 
    <size>300</size> 
    </estate> 
    <estate id="12345679"> 
    <description>bbb</description> 
    <size>450</size> 
    </estate> 
</provider> 

<provider name="Bar"> 
    <estate id="987654321"> 
    <description>yyy</description> 
    <size>100</size> 
    </estate> 
    <estate id="987654320"> 
    <description>zzz</description> 
    <size>240</size> 
    </estate> 
</provider> 

</estates> 

el que recibo de un servicio web de la mía. Me gustaría crear instancias de las clases de Android "Estates", "Provider" y "Estate", utilizando la biblioteca simple-xml.

Clase Estates.java:

@Root 
public class Estates { 
    @ElementList 
    private List<Estate> providers; 

    @Attribute 
    private String version; 
} 

Clase Estate.java:

public class Estate { 
    @Attribute 
    private String id; 

    @Element(required=false) 
    private String description; 

    @Element(required=false) 
    private Integers size; 
} 

Es decir, yo uso un @ElementList (List&lt;Estate&gt; providers) para los proveedores, pero de esta manera sólo puedo utilizar un lista de proveedores (que tiene dos listas, como en mi ejemplo, da:

"ERROR/com.simplexml.XmlActivity (4266): excepción no detectada: org.simpleframework.xml.core.PersistenceException: 'proveedores' de elementos declarados dos veces en la línea 1").

Más, no puedo obtener el atributo "nombre". En la práctica, supongo que tengo que descartar el enfoque "List<Estate> providers", pero ¿cómo reemplazarlo? ¿Debo usar una "Colección"?

Respuesta

16

Tenga en cuenta que simple-xml también le permite configurar los POJO de manera tal que le permita tener la lista en línea. En otras palabras, puede eliminar el elemento <providersList> y aún así la matriz de <provider> s será reconocible.

Esto es importante cuando no tiene control sobre la estructura del XML que se recibe. En su caso, si se atuvo a la definición XML según la pregunta original, lo anotaría así:

@ElementList(inline=true) 
    private List<Estate> providers; 
+0

¡Gracias! Eché de menos la anotación en línea, realmente simplifica todo el xml ... – MarcoS

0

contesto mi propia pregunta a afirmar que probablemente tenía un error con la definición XML, lo que debería ser:

<estates version="0.1"> 
<providerslist> 
    <provider name="Foo"> 
    <estateslist> 
    <estate id="12345678"> 
    <description>aaa</description> 
    <size>300</size> 
    </estate> 
    <estate id="12345679"> 
    <description>bbb</description> 
    <size>450</size> 
    </estate> 
    </estateslist> 
    </provider> 
    <provider name="Bar"> 
    <estateslist> 
    <estate id="987654321"> 
    <description>yyy</description> 
    <size>100</size> 
    </estate> 
    <estate id="987654320"> 
    <description>zzz</description> 
    <size>240</size> 
    </estate> 
    </estateslist> 
    </provider> 
</providerslist> 
</estates> 

De esta manera puedo analizar fácilmente a, "Proveedores" "Estates" y "Raíces "clases, las dos primeras tienen una ElementList para contener la lista interna.

Esto cierra la pregunta.

Cuestiones relacionadas