Die Situation
Ich verwende MOXys JAXB-Implementierung, um mit einem großen XML-Dokument zu arbeiten, dessen Schema viele ähnliche komplexe Typen aufweist. Insbesondere gibt es etwa zwei Dutzend Typen, die als Listen-Wrapper-Elemente mit der folgenden Struktur fungieren:
%Vor%Für jedes dieser Listen-Wrapper-ähnlichen Elemente ändert sich der Name und das enthaltene Listenelement ändert sich. Die Attribute (die alle optional sind) und das einzelne Element EXTENSION (auch optional) sind jedoch immer vorhanden. Hier ist ein Beispiel für die Verwendung von zwei Arten:
%Vor%Die Frage
Ich möchte die Code-Duplizierung vermeiden, da sich zwischen diesen Elementen nur der Name und die einzelnen Elemente ändern. Was ist der beste Weg, dies zu tun?
Ich kann nur zwei mögliche Lösungen sehen.
1
Erstellen einer konkreten Klasse mithilfe von Generika, um den Objekttyp anzugeben, der in der Sammlung verwendet werden soll, die sich ändert. Verwenden Sie dann die externen OX-Zuordnungen von MOXy, um anzugeben, wie jede einzelne Verwendung der Klasse serialisiert werden soll. Etwas wie:
%Vor%Obwohl mir diese Option gefällt, scheint es nicht möglich zu sein, die OX-Zuordnungen einer Klasse auf Benutzerebene neu zu definieren.
2
Erstellen einer Basisklasse ohne die List-Eigenschaft und Erstellen einer konkreten Klasse für jedes benutzerdefinierte Wrapperelement Diese Lösung funktioniert definitiv, aber ich werde mit ungefähr zwei Dutzend nah-identitischen Klassen enden.
Ist entweder # 1 möglich oder gibt es einen besseren Weg, damit umzugehen, an den ich nicht gedacht habe?
Vielen Dank im Voraus!
Und um die XML-Instanz zu lesen
%Vor%Aber ist Code-Duplikation wirklich wichtig? Wenn Ihr Schema eine gemeinsame Erweiterungsbasis für die Listencontainertypen hat und Sie xjc verwenden, warum vermeiden Sie unterschiedliche Klassen? Nach all der Idee hinter JAXB ist eine Wertklasse für jeden einzigartigen komplexen Typ.
Wenn Sie eine Allzwecklogik erstellen können, die ähnliche, aber unterschiedliche XML-Typen verarbeitet und keine große Anzahl von Java-Klassen benötigt, können Sie zu StAX wechseln.