Наследование с помощью Simple XML Framework - PullRequest
3 голосов
/ 27 июля 2011

Я использую Simple XML Framework для анализа XML-файлов.

С сервера я получаю XML-файл, который выглядит следующим образом:

<Objects>
   <Object type="A">
      <name></name>
      <color></color>
   </Object>
   <Object type="B">
      <shape></shape>
      <weight></weight>
   </Object>
<Objects>

У меня есть интерфейс (или суперкласс) Объект и два подкласса A и B

Можно ли десериализовать этот XML-Документ?

Я видел в Tutorial , что есть возможность различать подклассы с атрибутом class , но, к сожалению, это невозможно для меня.Есть ли способ выбрать, что фреймворк выбирает правильный подкласс на основе атрибута типа?

Я не могу использовать другой фреймворк (например, JAXB), потому что я использую Android ..

Ответы [ 2 ]

1 голос
/ 31 июля 2011

Простой XML тоже может сделать это, если вы готовы внести одно небольшое изменение в ваш XML.Итак, в вашем примере вы можете изменить этот xml так, чтобы он выглядел следующим образом:

<Objects>
   <A>
      <name></name>
      <color></color>
   </A>
   <B>
      <shape></shape>
      <weight></weight>
   </B>
<Objects>

И тогда у вас может быть следующая Java:

@ElementListUnion({
    @ElementList(entry = "A", inline = true, type = A.class),
    @ElementList(entry = "B", inline = true, type = B.class)
}
private List<BaseClass> objects;

И это все, что естьк этому.Хотя я не думаю, что это может быть сделано на основе атрибута.Хотя я могу ошибаться, вы можете прочитать документы для этого.

0 голосов
/ 13 марта 2012

Это будет сложно сделать, если вы не можете использовать атрибут класса, например:

<Objects>
  <Object class="ObjectA">
    <name></name>
    <color></color>
  </Object>
  <Object class="ObjectB">
    <shape></shape>
    <weight></weight>
  </Object>
<Objects>

Зачем заменять атрибуты type="A" и type="B" на классы, используя регулярное выражениеперед передачей в десериализатор Simple XML?Например:

xml = xml.replaceAll("type=\"([A-Za-z0-9_]+)\", "class=\"$1\"");

Я смог использовать этот трюк для синтаксического анализа XML, созданного сериализатором XML .NET, который использует атрибут xsi:type, чтобы указать конкретный тип класса в полиморфных списках, таких как этот.

...