2011-08-09 15 views
10

mam tej struktury danych:Android, simple-xml, jak zadeklarować listę elementów?

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

które otrzymuję z usługi internetowej kopalni. Chciałbym utworzyć instancje Android "Estates", "Provider" i "Estate" przy użyciu biblioteki simple-xml.

Klasa Estates.java:

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

    @Attribute 
    private String version; 
} 

Klasa Estate.java:

public class Estate { 
    @Attribute 
    private String id; 

    @Element(required=false) 
    private String description; 

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

Ie używam @ElementList (List&lt;Estate&gt; providers) dla dostawców, ale w ten sposób można używać tylko jednego lista dostawców (dwie listy, jak w moim przykładzie, daje:

"ERROR/com.simplexml.XmlActivity (4266): Uncaught wyjątek: org.simpleframework.xml.core.PersistenceException: Element" provider "zadeklarowany dwukrotnie w wierszu 1").

Więcej, nie mogę uzyskać atrybutu "nazwa". W praktyce, przypuszczam, że muszę odrzucić podejście "List<Estate> providers", ale jak je zastąpić? Czy powinienem użyć "kolekcji"?

Odpowiedz

16

Należy pamiętać, że simple-xml umożliwia również konfigurację POJO w taki sposób, aby umożliwić wyświetlanie listy w linii. Innymi słowy, możesz pozbyć się elementu <providersList> i nadal będzie rozpoznawalna tablica z <provider>.

Jest to ważne, gdy nie masz kontroli nad strukturą odbieranego pliku XML. W twoim przypadku, jeśli utwierdzisz definicję XML zgodnie z pierwotnym pytaniem, będziesz ją opatrywać adnotacją:

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

Dzięki! Brakowało mi adnotacji śródliniowej, to naprawdę upraszcza cały plik xml ... – MarcoS

0

mi odpowiedzieć na moje własne pytanie, aby stwierdzić, że prawdopodobnie miał błąd z definicji XML, który powinien być:

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

ten sposób można łatwo przetwarzać je na „Estates”, „Dostawcy” i „Estate "klasy, z których pierwsze dwa mają ElementList, aby zawierać wewnętrzną listę.

To zamyka pytanie.