JAXB Objektstruktur "splitten"

Hallo!

Ich habe folgendes Problem:
Ein XML File wurde eingelesen und mit JAXB „unmarshalled“. D.h. nun habe ich eine befüllte Objektstruktur.
Mein Ziel: ich möchte, dass bestimmte Elemente des XML in eigenes File gepseichert werden, und der Rest ebenfalls in ein eigenes XML-File.
Z.B. Wurzel-Element „Angestellte“. Alle „Manager“ Elemente (Personen mit Unterelementen wie „Name“, etc.) sollen in ein XML-File geschrieben werden (Wurzel-Element bleibt „Angestellte“). Und alle anderen Personen wie „Reinigungskraft“, „Programmierer“, „Assistenten“ in EIN XML-File (Wurzel-Element heißt auch hier wieder „Angestellte“).

Ich muss JAXB verwenden. D.h. XMLInputFactory, ect. kann ich nicht verwenden.

Kann man das Problem eventuell mit Reflections lösen?

Google konnte mir bisher auch nicht weiterhelfen …

Danke schon mal im Voraus!

LG,
EV*A

Hallo EV*A,

…bestimmte Elemente sollen aus dem XML gefiltert werden…

Ich muss JAXB verwenden.

Habe ich ehrlich gesagt keine Erfahrung mit.

Kann man das Problem eventuell mit Reflections lösen?

Vielleicht habe ich dein Problem nicht richtig verstanden, aber sollte sich das nicht ohne Reflections lösen lassen?

Ich kenne dein XML Schema nicht, aber wenn ich dich richtig verstanden habe sind unterhalb von „Angestellte“ bunt gemischt „Manager“, „Programmierer“ und weitere Elemente vereinigt.

Gehen wir mal von folgendem vereinfachten Quick’n’Dirty Schema aus:

<?xml version="1.0" encoding="UTF-8"?>

Die durch xjc erzeugte Klasse Angestellte enthält eine Liste von Managern und eine Liste von Programmierern. Wenn du nun jeweils das herausfilterst (den Listeninhalt löschen) was du gerade nicht benötigst sollte das Ziel doch erreicht sein.

Input Beispiel:

<?xml version="1.0"?>HeavyUdo Hoeneß

Java Code:

 JAXBContext jc = JAXBContext.newInstance(Angestellte.class);

 Unmarshaller um = jc.createUnmarshaller();
 File xml = new File("test.xml");
 Angestellte a = (Angestellte) um.unmarshal(xml);

 // Manager entfernen
 a.getManager().clear();

 Marshaller marshaller = jc.createMarshaller();
 marshaller.setProperty(Marshaller.JAXB\_FORMATTED\_OUTPUT, true);
 marshaller.marshal(a, System.out);

Output:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>Heavy

War es das was du wolltest?

Gruß
Heavy

Hallo!

Ja das ist genau das, was ich brauche! :smile: Danke!!

Ich habe allerdings noch ein kleines Problem: meine Struktur im XML sieht etwa wie folgt aus:

Peter

Um die clear()-Methode aufrufen zu können muss ich (basierend auf deinem Code) folgendes tippen:
a.getManager().getUntergeordnete().getManager().clear();
Bei a.getManager() gibt es die clear()-Methode noch gar nicht. Allerdings möchte ich aber das äußerste Manager-Element samt allen Unterlementen löschen.

Weißt du woran das liegt? Bzw. wie das geht? :smile:

Danke!

Hallo,

Ja das ist genau das, was ich brauche! :smile: Danke!!

das ist schon mal schön.

Um die clear()-Methode aufrufen zu können muss ich (basierend
auf deinem Code) folgendes tippen:
a.getManager().getUntergeordnete().getManager().clear();
Bei a.getManager() gibt es die clear()-Methode noch gar nicht.

Weißt du woran das liegt? Bzw. wie das geht? :smile:

Das wird nun etwas schwierig, ich habe den Java Code aus meinem einfachen XML Schema erzeugen lassen. Habe mir schon gedacht, dass es wohl etwas komplexer ist, mit verschachtelten Managern habe ich allerdings nicht gerechtnet. Hast du ein XML Schema zu diesen XML Dateien? Wenn es für den äußeren Manager kein List Objekt gibt, darf es den evtl. nur einmal (ggf. zwingend) geben.

JAXP scheint beim „marshaling“ allerdings keine Validierung durchzuführen (zumindest bei meinem Test), daher könnte es funktionieren den äußeren Manager auf null zu setzten:

a.setManager(null);

Gruß
Heavy