3 Stimmen

Vererbung mit Simple XML Framework

Ich benutze die Einfacher XML-Rahmen zum Parsen von XML-Dateien.

Von einem Server erhalte ich eine XML-Datei, die wie folgt aussieht:

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

Ich habe eine Schnittstelle (oder Superklasse) Objekt und zwei Unterklassen A y B

Ist es möglich, dieses XML-Dokument zu de-serialisieren?

Ich sah in der Tutorial dass es eine Möglichkeit gibt, zwischen Unterklassen zu unterscheiden mit einem Klasse -Attribut, aber leider ist dies bei mir nicht möglich. Gibt es eine Möglichkeit zu wählen, dass der Rahmen die richtige Unterklasse auf der Grundlage des Typ-Attributs wählt?

Ich kann kein anderes Framework (wie JAXB) verwenden, weil ich Android verwende.

1voto

Robert Massaioli Punkte 13111

Simple XML kann das auch, wenn Sie bereit sind, eine kleine Änderung an Ihrem XML vorzunehmen. In Ihrem Beispiel könnten Sie also die XML-Datei so ändern, dass sie wie folgt aussieht:

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

Und dann könnte man das folgende Java haben:

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

Und das ist auch schon alles, was es dazu zu sagen gibt. Allerdings glaube ich nicht, dass dies auf der Grundlage eines Attributs möglich ist. Ich könnte mich aber irren, vielleicht möchten Sie die Dokumente lesen für diesen.

0voto

Das wird schwierig, wenn Sie das Attribut class nicht verwenden können, etwa so:

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

Warum ersetzen Sie Ihr type="A" y type="B" Attribute mit Klassen mit Hilfe eines regulären Ausdrucks, bevor sie an den Simple XML Deserializer übergeben werden? Zum Beispiel:

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

Ich konnte diesen Trick beim Parsen von XML verwenden, das vom XML-Serializer von .NET erzeugt wurde, der das Attribut xsi:type um den spezifischen Klassentyp in polymorphen Listen wie der vorliegenden anzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X