JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben

chrk

Mitglied
Hallo zusammen :)

Ich komme bei meinem Vorhaben einfach nicht mehr weiter... :noe:

Einlesen will ich ein einfaches XML-Dokument das so aussieht:

[XML]
<root>
<detailierteInformationen>
<zahl>12345</zahl>
<att1>"hier kommt ein Wert"</att1>
<att2>"noch ein Wert"</att2>
</detailierteInformationen>
</root>
[/XML]

JAXB soll beim Marshal folgendes ausgeben:

[XML]
<de-schema:detailierteInformationen att1="hier kommt ein Wert"" att2="noch ein Wert">12345</de-schema:detailierteInformationen>
[/XML]


Dafür habe ich zwei Schemata. Die Schemata werden mit JAXB eingelesen und soll dann mit XmlAdapter behandelt werden.

Hauptschema (Namespace: de-schema):

[XML]
<xs:element name="detailierteInformationen"
id="de-schema-detailierteInformationen"
substitutionGroup="xi:item"
type="xi:zahlItemType" />
[/XML]

2. Schema (Namespace: xi):
[XML]
<element name="root">
<complexType>
<sequence>
<element ref="...." minOccurs="1" maxOccurs="unbounded" />
<element ref="...." minOccurs="1" maxOccurs="unbounded" />
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="xi:item"/>
</choice>
</sequence>
<attribute .... />
</complexType>
</element>

<element name="item" type="anyType" abstract="true">

<complexType name="zahlItemType" final="extension">
<simpleContent>
<extension base="xi:zahl">
<attributeGroup ref="xi:weitereAttribute" />
</extension>
</simpleContent>
</complexType>

<simpleType name="zahl">
<restriction base="decimal" />
</simpleType>

<attributeGroup name="weitereAttribute">
<attributeGroup ref="xi:nochmalsWeitereAttribute" />
<attribute name="att1" type="xi:att1Type" use="optional" />
<attribute name="att2" type="xi:att2Type" use="optional" />
</attributeGroup>
[/XML]



Mit JAXB generierter Java-Code.

Objectfactory vom Hauptschema:
Java:
@XmlElementDecl(namespace = "de-schema", name = "detailierteInformationen", substitutionHeadNamespace = "xi", substitutionHeadName = "item")
    public JAXBElement<zahlItemType> createDetaillierteInformation(zahlItemType zahl) {
        return new JAXBElement<zahlItemType>(_detailierteInformationen_QNAME, zahlItemType.class, null, zahl);
    }


XI-Schema hat den Java-Code:
Java:
Root.class

 @XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false)
//...
protected List<Object> itemList;

ZahlItemType.class

@XmlJavaTypeAdapter(ZahlItemTypeAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "zahlItemType", namespace = "xi", propOrder = {
    "zahl"
})

public class ZahlItemType {
	// Hier stehen die Getter und Setter Methoden, sowie Annotationen @XmlValue und @XmlAttribute.
}


Beim Einlesen der XML habe ich die Werte als Elemente und sollen dann als Attribute erscheinen.

Dafür hätte ich die Klasse ZahlenItemTypeAdapter.

Java:
public  class ZahlItemTypeAdapter extends XmlAdapter<AdaptedZahl, ZahlItemType> {
 // Methoden marshal und unmarshal...
}


Jedoch funktioniert das nicht so wie ich es will! :noe: Er erkennt die XmlAdapter Klasse nicht.

Es soll später auch möglich sein, z.B. das Element detailierteInformationen zu erkennen und die Werte von dem auf die Werte eines anderen Elements addieren. Desweiteren muss beim Einlesen der XML kein Namespace vorhanden sein. Beim Ausgeben jedoch schon.
 
Zuletzt bearbeitet:

jstei001

Aktives Mitglied
Ich nehme an du nutzt Java 1.6? Denn die Klasse XML-Adapter gibts erst seit JAXB 2.0. Bei mir erkennt er die nämlich ohne Probleme
 
Zuletzt bearbeitet:

chrk

Mitglied
Ich nehme an du nutzt Java 1.6? Denn die Klasse XML-Adapter gibts erst seit JAXB 2.0. Bei mir erkennt er die nämlich ohne Probleme

Danke für die Hilfe. Ich habe JAXB 2.2 und JDK1.7

Das Ding ist, dass die JAXBElemente nur Attribute hat.
Aber ich möchte das jedes JAXBElement Unterelmente beim Einlesen hat.

Ich dachte ich löse das über das hier:
Java XML & JSON Binding: Mapping an Arbitrary List of Objects using JAXB's @XmlAnyElement and XmlAdapter

Jedoch ist es bei mir etwas komplexer, da ich nur eine Liste mit Objects besitze. Dort eben Items, das JAXBElemente.class sind. Jetzt sollen alle JAXBElemente.class unterelemente beim Einlesen habe, die ich dann weiterverarbeiten kann.

<JAXBElement>
element1
element2
etc.
</JAXBElement>

Ich verzweifle so langsam... ;(
Mittlerweile denke ich, dass JAXB nicht das richtige ist und ich es manuell coden muss.
 

chrk

Mitglied
Ich könnte die XML mit DOM einlesen und mit JAXB ausgeben. Aber das wäre ja nicht das Ziel, da es einiges an Handarbeit bedeuten würde. :(
 

jstei001

Aktives Mitglied
Ich verstehe das jetzt so das dein Wunsch-JAXB so aussehen soll:

Java:
Class JAXBElement

Object element1;
Object element2;

getElement1(();

setElement1(object value);

.....

Dann musst du aber dein XSD ändern damit dir JAXB das so generiert, oder musst du mit diesem XSD arbeiten und kannst daran nichts ändern? Mein Problem ist ich verstehe dein Vorhaben nicht ganz was du eigentlich machen willst, wenn du das genauer erklärst gibts vllt ne einfache Lösung. Mit DOM bist du natürlich flexibler allerdings beinhaltet das auch en menge Arbeit gerade den XML Code zu erzeugen. Da ist ein JAXB Marshaller doch schon sehr angenehm.
 

chrk

Mitglied
Die XSD lässt sich nicht ändern und ist etwas komplexer. Für das Marshalling will ich den Java-Code benutzen, der durch die XSD generiert wurde. Für das Unmarshalling will ich jedoch eine zusätzliche Java-Klasse benutzen, die die ZahlItemType.class ersetzt.


Das JAXBElement bekommt ja die ZahlItemType.class zugewiesen.

ZahlItemType.class

Java:
@XmlJavaTypeAdapter(ZahlItemTypeAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "zahlItemType", namespace = "xi", propOrder = {
    "zahl"
})
 
public class ZahlItemType {
   @XmlValue 
   String value;
   @XmlAttribute
   String att1;
   @XmlAttribute
   String att2;

   public void setValue(String value) {
        this.value = value;
    }
    public String getValue() {
        return value;
    }

    // weitere Set/Get Methoden
}

Das wäre dann die XML:

[XML]
<root>
<de-schema:detailierteInformationen att1="hier kommt ein Wert"" att2="noch ein Wert">12345</de-schema:detailierteInformationen>
</root>
[/XML]

Nun möchte ich aber diese XML auslesen:

[XML]
<root>
<detailierteInformationen>
<zahl>12345</zahl>
<att1>"hier kommt ein Wert"</att1>
<att2>"noch ein Wert"</att2>
</detailierteInformationen>
</root>
[/XML]

Und dann das Element zahl aus der XML dem XmlValue in der Java-Klasse ZahlItemType zuweisen.. Element att1 aus der XML dem XmlAttribute att1 in der Java-Klasse ZahlItemType zuweisen....

Hierfür würde ich gerne ein XmlAdapter auf ZahlItemType setzen. Mit @XmlJavaTypeAdapter(ZahlItemTypeAdapter.class).

Java:
public  class ZahlItemTypeAdapter extends XmlAdapter<AdaptedZahl, ZahlItemType> {

 	@Override
	public ZahlItemType unmarshal(AdaptedZahl az) throws Exception {
		ZahlItemType mit = new ZahlItemType();
		mit.setValue(az.getZahl);
		return mit;
	}
}
}

AdaptedZahl.class hat nun die Elemente zahl, att1, att2

Java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "adaptedZahl", namespace = "", propOrder = {
    "zahl",
    "att1",
    "att2"
})

public class AdaptedZahl {
	
	@XmlElement(name ="zahl", nillable=true, required=true)
	protected  String zahl;
       // ...weiter XmlElemente

	public String getZahl() {
	      return zahl;
	}

Demo.class
Java:
    	JAXBContext jc = JAXBContext.newInstance("package.name");
    	ZahlItemTypeAdapter adapter = new ZahlItemTypeAdapter();
        Unmarshaller u = jc.createUnmarshaller();
        u.setAdapter(adapter);
        File xml = new File("D:/", "test.xml");
        Root root = (Root) u.unmarshal(xml);
		JAXBElement o = (JAXBElement) root.getItemList().get(0);
        ZahlItemType mit = (ZahlItemType) o.getValue();
 
Zuletzt bearbeitet:

jstei001

Aktives Mitglied
OK ich verstehe dein Problem, da muss ich aber auch bissl drüber nachdenken, mit JAXB wirds glaub ich nicht direkt gehen, weil der nur XML Unmarshalln kann die auch Valide zu den erzeugten Klassen sind.

Ich würde da jetzt vllt mal über XPATH oder STAX nachdenken, denn du brauchst ja nur die Element-Werte. Das ist glaub ich vom Aufwand her noch ertragbar.

Dann kannste ja die Setter von der JAXB Klasse nutzen um diese einzupflegen und dann mit marshal eine XML erzeugen.

Wenn mir was besseres einfällt schreib ich nochmal.
 

chrk

Mitglied
OK ich verstehe dein Problem, da muss ich aber auch bissl drüber nachdenken, mit JAXB wirds glaub ich nicht direkt gehen, weil der nur XML Unmarshalln kann die auch Valide zu den erzeugten Klassen sind.

Ich würde da jetzt vllt mal über XPATH oder STAX nachdenken, denn du brauchst ja nur die Element-Werte. Das ist glaub ich vom Aufwand her noch ertragbar.

Dann kannste ja die Setter von der JAXB Klasse nutzen um diese einzupflegen und dann mit marshal eine XML erzeugen.

Wenn mir was besseres einfällt schreib ich nochmal.

Genau darüber habe ich auch schon nachgedacht. Das Problem ist das es über 2500 JAXBElemente gibt. Die auzulesene XML hat einen Wurzelelement (Root), dann die 2500 Parentelemente(bei JAXB die JAXBElemente) und diese dann ca. 10 Childelemente.

Manche Parentelemente müssen ohnehin zusammen addiert werden und ergeben ein neues Parentelement.

Deswegen wäre wohl DOM die beste Möglichkeit und dann alle Elemente als XML über die Setter Methoden von JAXB ausgeben
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JAXB und verschachtelte Elemente? XML & JSON 6
aze JaxB Elemente in LinkedHashSet werden nicht wiededergegeben XML & JSON 3
8u3631984 jaxb XML Mapper - Root Element mit Attribut XML & JSON 20
W jaxws jaxb wsdl Java-Klassen generieren und binding.xml verwenden XML & JSON 1
Rakshan Unmarshalling multiple namespaces with jaxb XML & JSON 0
B JAXB und HTML XML & JSON 1
E JAXB und java.nio.file.Path XML & JSON 4
W jaxb-api XML Feld nicht gesendet setzt das Defaultvalue nicht XML & JSON 3
S Muss ich bei JAXB immer noch eine zusaetzliche List-Wrapper Klasse erstellen wenn ich mehrere Objekte serialisieren will..? XML & JSON 1
S JAXB mit mehreren zusammenhängenden .xsd-Files XML & JSON 0
N JAXB: Überflüssiges Wrapper-Tag für Map-Einträge XML & JSON 0
D JAXB mit Map und Color XML & JSON 2
K JAXB-XML unvollständig XML & JSON 1
K JAXB Unmarshelling XML & JSON 1
E JAXB und abstrakte Klasse(n) XML & JSON 0
B JAXB - Unmarshal -> Kinder bekommen und die Kinder von den Kinder XML & JSON 7
B JAXB - Marshal ArrayList XML & JSON 2
B JAXB - java.util.Locale does not have a no-arg default constructor XML & JSON 2
B JAXB-Fehler bei REST-Api XML & JSON 0
M JAXB HashMap Dynamisches Laden XML & JSON 0
M JAXB @XMLID und @XMLIDREF, wie Daten hinzufügen XML & JSON 2
P JAXB-Problem XML & JSON 1
A JAXB: XMLMixed generieren XML & JSON 0
R [JAXB] XmlRootElement und XmlType gemeinsam nutzen XML & JSON 0
I XML to Object - Mapping mit JAXB 1.0 XML & JSON 1
L JAXB - Generischen Wert mit Liste belegen XML & JSON 1
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
K JAXB Annotation @XMLRootElement vererben XML & JSON 0
F JAXB Unmarshal - Kein "default Constructor" XML & JSON 2
F.S.WhiTeY JAXB: Schema nicht "erben" XML & JSON 2
B JAXB - manuell Klassen aus xsd XML & JSON 3
S Jaxb Unmarshalling Problem XML & JSON 4
S JAXB - Any Elementliste - wie Werte verändern? XML & JSON 4
R JAXB: A cycle is detected in the object graph. This will cause infinitely deep XML XML & JSON 6
M JAXB versucht abstrakte Klasse zu erzeugen XML & JSON 7
M JAXB: automatisches Groß schreiben Property XML & JSON 9
C Projekt - JAXB, EMF oder doch DOM? XML & JSON 4
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
J JAXB: Mehrmals abspeichern XML & JSON 3
D XML Einlesen mit JaxB XML & JSON 4
W JAXB Binding customization XML & JSON 4
L JAXB und Interfaces XML & JSON 4
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
eykarhorn JAXB namespace attribut aus rootelement entfernen XML & JSON 2
nrg JAXB - nor any of its super class is known to this context XML & JSON 3
S aus XML mit JAXB zu Baumstruktur XML & JSON 3
nrg JAXB generell auf XMLs übertragbar XML & JSON 22
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
B PropertyChangeListener generieren mit JAXB (xjc) XML & JSON 3
G JAXB XML-Attribute feststellen XML & JSON 4
S JAXB 2 und JSR 303 XML & JSON 11
M [JAXB] @XmlAnyElement namespace XML & JSON 4
R JAXB Unmarshal XML & JSON 2
J JAXB und ArrayList XML & JSON 4
Landei Jpa2 -> jaxb??? XML & JSON 9
M JAXB - HashMap XML & JSON 1
dzim JAXB-Unmarshalling ignoriert/löscht Einträge aus XML - oder lässt sie verschwinden XML & JSON 3
S JAXB 2 und Java Annotationen/Interfaces generieren XML & JSON 3
ruutaiokwu jaxb eclipse plugin... XML & JSON 3
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
R JAXB ausgewählte Felder XML & JSON 10
TiME-SPLiNTER JAXB: com.sun.xml.bind.v2.ContextFactory XML & JSON 3
V JAXB und leere Listen XML & JSON 2
L compareto(), equals() in JAXB generierten Dateien XML & JSON 3
D jaxb validierung/verification vor marshalling XML & JSON 3
J JAXB mit GregorianCalendar XML & JSON 4
HombreDelMundo JAXB can't handle interfaces XML & JSON 4
N Individuelles Wrapper-Element um Collection mit JAXB XML & JSON 6
B JAXB Unmarshalling mehrerer Objekte XML & JSON 2
V JAXB schema 2 java XML & JSON 3
B JPA + JAXB Mapping Problem XML & JSON 2
S Navigieren in unbekannten JAXB-Objecten XML & JSON 2
J JAXB NullPointerException im ContextFinder XML & JSON 6
H JAXB und STAX XML & JSON 2
H JAXB Probleme beim Unmarshalling XML & JSON 3
C Serialisierung mit JAXB XML & JSON 6
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
S JAXB und viele verschachtelte Attribute XML & JSON 1
J JAXB - Map XML & JSON 2
O JAXB generierte Klassen sollen Serializable implementieren XML & JSON 1
aze JaxB: Nullelemente in Array nicht anzeigen XML & JSON 3
turmaline JAXB can't handle interfaces XML & JSON 20
sambalmueslie JAXB - Unmarshall ein XML-Document das aus zwei XSD Definitionen besteht XML & JSON 8
S JAXB und abstrakte Klasse(n) XML & JSON 4
P JAXB: Marshalling XML & JSON 7
M JAXB: Wie folgendes Konstrukt abbilden? XML & JSON 20
A Jaxb und Interfaces XML & JSON 12
B JaxB und XSD :-) XML & JSON 8
G JAXB - Marshaller - kein Rückgabewert XML & JSON 2
N XML will nicht weder JAXB noch XStream XML & JSON 8
F Zugriff auf durch JAXB erzeugte Object-Struktur... XML & JSON 6
C Java-Imports bei Jaxb XML & JSON 8
F Marshaling eines JAXB Objektes worin ein anderes JAXB Objekt eingeschlossen ist XML & JSON 6
K JAXB, Vererbung und Codegeneration XML & JSON 2
M XmlRootElement und JAXB XML & JSON 4
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
G jaxb Vector (oder ähnliches) von Elementen generieren XML & JSON 6
M Jaxb Annotationen, Wert als XML Element XML & JSON 2
J JCheckbox abfragen und serialisieren mit JAXB 2.0 XML & JSON 15
F JAXB erste schritte XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben