Как обрабатывать наследование с помощью платформы SimpleXML?

В настоящее время я использую структуру SimpleXML для анализа XML-файла и сталкиваюсь с повторяющейся проблемой.

Полученный XML может быть примерно таким:

<root>
   <B>
      ...
   </B>
</root>

или что-то вроде того:

<root>
   <C>
      ...
   </C>
</root>

И я хочу, чтобы B и C расширили другой класс, скажем, A.

Аккуратный способ сделать это с помощью SimpleXML:

@Root(name="root")
class Root {

   @Element(name="B", required="false")
   private B b;

   @Element(name="C", required="false")
   private C c;
}

class B extends A {

}

class C extends A {

}

Я знаю, что могу сделать то, что нашел в документации SimpleXML, изменив формат XML:

<root>
   <A class="example.B">     // or "example.C"
      ...
   </A>
</root>

а затем мои классы Java:

@Root(name="root")
class Root {

   @Element(name="A")
   private A a;
}

class B extends A {

}

class C extends A {

}

Мне бы очень хотелось использовать это решение, но я совсем не уверен, хочу ли я пройти процесс изменения XML на стороне клиента перед его разбором. Проблема в том, что это невозможно сделать на стороне сервера, так как я не могу это контролировать.

Итак, мои вопросы:

Это единственное решение, которое у меня есть?

В таком случае, не знаете ли вы, ребята, есть ли быстрое решение для изменения моего XML-файла на стороне клиента?


person Romain Piel    schedule 26.04.2012    source источник


Ответы (1)


Я не уверен, как сделать наследование, но я нашел решение с использованием интерфейсов (в моем случае это нормально)

Хитрость заключается в использовании:

@Root(name="root")
class Root {

   @ElementUnion({
       @Element(name="B", type=B.class),
       @Element(name="C", type=C.class)
   })
   private A a;
}

interface A {

}

class B implements A {

}

class C implements A {

}

Хотя было бы неплохо, если бы мы могли сделать то же самое с наследованием.

ОБНОВЛЕНИЕ: наследование доступно с использованием @ElementUnion. Хотя это не указано в документе, это тоже работает:

@Root(name="root")
class Root {

   @ElementUnion({
       @Element(name="B", type=B.class),
       @Element(name="C", type=C.class)
   })
   private A a;
}

class A {

}

class B extends A {

}

class C extends A {

}
person Romain Piel    schedule 26.04.2012