Android, simple-xml, как объявить список элементов? - PullRequest
12 голосов
/ 09 августа 2011

У меня есть такая структура данных:

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

, который я получаю от моего веб-сервиса. Я хотел бы создать экземпляры классов Android "Estates", "Provider" и "Estate" с помощью библиотеки 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;
}

Т.е. я использую @ElementList (List&lt;Estate&gt; providers) для провайдеров, но таким образом я могу использовать только один список провайдеров (имеющий два списка, как в моем примере, дает:

«ОШИБКА / com.simplexml.XmlActivity (4266): необработанное исключение: org.simpleframework.xml.core.PersistenceException: элемент« поставщики »объявлен дважды в строке 1»).

Более того, я не могу получить атрибут "name". На практике, я полагаю, я должен отказаться от подхода "List<Estate> providers", но как его заменить? Стоит ли использовать «Коллекцию»?

Ответы [ 2 ]

18 голосов
/ 10 августа 2011

Обратите внимание, что simple-xml также позволяет вам настраивать POJO таким образом, чтобы вы могли иметь список в строке.Другими словами, вы можете покончить с элементом <providersList>, и все же массив <provider> s будет распознаваем.

Это важно, когда вы не контролируете структуру получаемого XML.В вашем случае, если вы придерживаетесь определения XML в соответствии с исходным вопросом, вы должны аннотировать его следующим образом:

@ElementList(inline=true)
   private List<Estate> providers;
0 голосов
/ 10 августа 2011

Я отвечаю на свой собственный вопрос, чтобы заявить, что, вероятно, у меня была ошибка с определением 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>

Таким образом, я могу легко разобрать его в "Состояния", "Поставщики" и "Классы Estate, первые два имеют ElementList, содержащий внутренний список.

Это закрывает вопрос.

...