Android, simple-xml, как объявить список элементов?
У меня есть эта структура данных:
<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>
который я получаю от моего веб-сервиса.
Я хотел бы создать экземпляры классов "Estates", "Provider" и "Estate" Android, используя библиотеку simple-xml.
Класс Estates.java:
@Root
public class Estates {
@ElementList
private List<Estate> providers;
@Attribute
private String version;
}
Класс Estate.java:
public class Estate {
@Attribute
private String id;
@Element(required=false)
private String description;
@Element(required=false)
private Integers size;
}
I.e., я использую @ElementList
(List<Estate> providers
) для провайдеров, но таким образом я могу использовать только один список провайдеров (имея два списка, как в моем примере, дает:
"ERROR/com.simplexml.XmlActivity(4266): исключение uncaught: org.simpleframework.xml.core.PersistenceException: поставщики провайдеров дважды объявляются в строке 1" ).
Больше, я не могу получить атрибут name. На практике я полагаю, что я должен отклонить подход "List<Estate> providers
", но как его заменить? Должен ли я использовать "Collection"?
Ответы
Ответ 1
Обратите внимание, что simple-xml также позволяет вам устанавливать POJO таким образом, чтобы вы могли иметь список в строке. Другими словами, вы можете покончить с элементом <providersList>
, и все же массив <provider>
будет узнаваем.
Это важно, когда вы не контролируете структуру получаемого XML. В вашем случае, если вы придерживаетесь определения XML в соответствии с исходным вопросом, вы должны его аннотировать следующим образом:
@ElementList(inline=true)
private List<Estate> providers;
Ответ 2
Я отвечаю на свой вопрос, заявляя, что, вероятно, ошибся с определением xml, которое должно быть:
<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>
Таким образом, я могу легко разобрать его на классы "Estates", "Providers" и "Estate", первые два имеют ElementList, чтобы содержать внутренний список.
Это закрывает вопрос.