JAXB: Wie folgendes Konstrukt abbilden?

Status
Nicht offen für weitere Antworten.

mfernau

Bekanntes Mitglied
Hallo!

Ich habe hier ein Problem. Ich bekomme eine DTD vorgegeben - diese lässt sich also nicht verändern.
Ich muss XML-Dateien, die mit dieser DTD erstellt wurden, einlesen können (unmarshal) und auch wieder ausgeben können (marshal).
Im Großen und Ganzen habe ich das schon hinbekommen. Bis auf ein paar Spezialfälle. Und dieser hier ist einer.

hier der passende Ausschnitt aus der DTD den ich nicht abgebildet bekomme:
Code:
<!ELEMENT LO_CODE (#PCDATA | LO_NUMBER)*>

Das Problem ist also das Vorhandensein von Text UND weiteren Elementen.

So sähe eine XML-Datei aus, die mit dieser DTD erstellt wurde:
Code:
<LO_CODE>15701906<LO_NUMBER><REPAIR_GROUP>15</REPAIR_GROUP><ILLUSTRATION_NUMBER>70</ILLUSTRATION_NUMBER><TASK>19</TASK><INDEX>06</INDEX></LO_NUMBER></LO_CODE>

Mein Problem ist eindeutig diese hässliche, aber AFAIK gültige, variation mit Text und Elementmischung. Wie bekomme ich sowas mit JAXB abgebildet?

Mein naiver Versuch sah so aus:
Java:
/**
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "value",
    "lonumber"
})
@XmlRootElement(name = "LO_CODE")
public class LOCODE {

    @XmlValue
    protected String value;
    @XmlElement(name = "LO_NUMBER")
    protected List<LONUMBER> lonumber;

    public String getvalue() {
        return value;
    }

    public void setvalue(String value) {
        this.value = value;
    }

    public List<LONUMBER> getLONUMBER() {
        if (lonumber == null) {
            lonumber = new ArrayList<LONUMBER>();
        }
        return this.lonumber;
    }
}

Schulg natürlich fehl:
Code:
If a class has @XmlElement property, it cannot have @XmlValue property.

und jetzt??
 

fastjack

Top Contributor
Ich habe das bisher nur mit XSD gemacht, da gehts folgendermaßen :

[XML]
<xsd:complexType name="Text" mixed="true">
<xsd:sequence>
<xsd:element name="text" type="Text"/>
</xsd:sequence>
<xsd:attribute name="ressource" type="xsd:string" use="optional"/>
</xsd:complexType>
[/XML]

wird zu :

Java:
package abc;

import java.io.Serializable;
import java.util.List;
import java.util.Vector;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for Text complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="Text">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="text" type="{}Text"/>
 *       &lt;/sequence>
 *       &lt;attribute name="ressource" type="{http://www.w3.org/2001/XMLSchema}string" />
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Text", propOrder = {
    "content"
})
public class Text {

    @XmlElementRef(name = "text", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content = new Vector<Serializable>();
    @XmlAttribute
    protected String ressource;

    /**
     * Gets the value of the content property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the content property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getContent().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link String }
     * {@link JAXBElement }{@code <}{@link Text }{@code >}
     * 
     * 
     */
    public List<Serializable> getContent() {
        if (content == null) {
            content = new Vector<Serializable>();
        }
        return this.content;
    }

    /**
     * Gets the value of the ressource property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getRessource() {
        return ressource;
    }

    /**
     * Sets the value of the ressource property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setRessource(String value) {
        this.ressource = value;
    }

}
 
Zuletzt bearbeitet:

mfernau

Bekanntes Mitglied
Danke erstmal für die schnelle Antwort. Das war ja echt flott :)

Kann mir aber leider nicht vorstellen wie mit das <any /> helfen soll. Das Teil kann jedes beliebige Element werden - aber die Elemente sind ja nicht mein Problem, sondern der Text in der Mischung mit Elementen. Ich behalte das aber mal im Auge. Frage parallel auch mal in der mailingliste von jaxb
 

Noctarius

Top Contributor
Das ist doch was er möchte. Wenn kein Child-Element wird vermutlich content gesetzt sonst resource.
 

Noctarius

Top Contributor
Er soll ja auch nur die Gültigkeit des DTD nachbilden in JaxB so wie ich es verstanden habe. Ergo braucht er das XSD nicht zwangsweise, sondern nur das, was das XSD erzeugt ;-)
 

mfernau

Bekanntes Mitglied
@fastjack

Hm, sehe ich das richtig, dass damit ein imaginäres Text-Element geschaffen wird, das beim marshal einfach nicht als "<Text>blubb</Text>" abgedruckt wird sondern nur als "blubb"?
Oder anders ausgedrückt - ich könnte so ein Text-Element dazu verwenden es als @XmlElement anstatt als @XmlValue in mein LOCODE einzubinden?

Das müsste ich mal testen. Klingt irgendwie interessant
 

mfernau

Bekanntes Mitglied
Genau Noctarius, ich muss XML Dateien einlesen und wieder erstellen können, die diesem DTD entsprechen.

Im detail ist das natürlich ein scheiss komplexes Gerüst verschiedener gegenseitig einbindender DTDs die ich mit xjc in Java-Klassen überführen konnte. Aber das hat scheinbar für diesen Fall nicht wirklich funktioniert. Ich kann händisch solche Klassen abändern, wenn danach das gültige XML heraus kommt. Damit habe ich kein großes Problem
 

mfernau

Bekanntes Mitglied
Also leider funktioniert das doch nicht.. wenn ich das so verwende, dann parst er mir das hier korrekt:
Code:
<LO_CODE>15701906</LO_CODE>

aber bei sowas hier:
Code:
<LO_CODE>15701906<LO_NUMBER><REPAIR_GROUP>15</REPAIR_GROUP><ILLUSTRATION_NUMBER>70</ILLUSTRATION_NUMBER>
<TASK>19</TASK><INDEX>06</INDEX></LO_NUMBER></LO_CODE>

kommt nur
Code:
<LO_CODE></LO_CODE>
 
Zuletzt bearbeitet:

fastjack

Top Contributor
Entschuldigt bitte, ich habe mal mein Beispiel von oben korrigiert :(
So müßte das in deinen Klassen ungefähr aussehen, damit du Element und Text mischen kannst.
 

mfernau

Bekanntes Mitglied
okay, besten Dank!
Ich hab's jetzt mit Deinem Gedankenanstoss geschafft! Hab einfach mal ein kleines XSD geschrieben das diesem Szenario entspricht und kompilieren lassen. Nun hab ich das passende Ergebnis!
 

desperatedusch

Neues Mitglied
hallo,
habe ein Problem, dass dem in diesem Thread besprochenen Thema entspricht.
ich möchte ein Docbook konformes xml Dokument mit JAXB in einer Objektstruktur abbilden.
der einfachste Testfall sieht so aus.
mein xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test>
<element>
text
<subelement>
<title>titel</title>
</subelement>
</element>
</test>
die dazugerhoerigen Java Klassen
Element.java:
Java:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlValue;

public class Element{
    @XmlValue
    public String value;
    @XmlElement(name = "subelement")
    public SubElement subelement;
}
und SubElement.java:
Java:
import javax.xml.bind.annotation.XmlElement;

public class SubElement{
	@XmlElement( name = "title" ) 
	public String title;
}

Über die Fehlermeldung
"If a class has @XmlElement property, it cannot have @XmlValue property."
bin ich auch hier gelandet.
Kann mir jemand von euch einen kleinen Denkansatz geben wie ich diese Klassenstruktur für mein DocBook-Dokument nutzen kann?
Vielen Dank und Grüße
Philipp
 

mfernau

Bekanntes Mitglied
Also als Beispiel poste ich Dir mal meine Klasse, wie sie nun funktioniert und diese Mixed-Dinger abbilden kann:

Java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
@XmlRootElement(name = "LO_CODE")
public class LOCODE {

    @XmlElementRefs({
        @XmlElementRef(name = "LO_NUMBER", type = LONUMBER.class),
    })
    @XmlMixed
    protected List<Serializable> content;

 
    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }
}

Das Zauberwort ist hier das @XmlMixed, welches angibt, dass sich sowohl Text, als auch weitere Elemente in diesem XML-Tag befinden können.

HTH,
Martin
 
T

Tomate_Salat

Gast
Nur so am Rande: xjc kann auch mit Dtd umgehen:
[c]xjc -dtd [DTD-DATEI][/c]
 

mfernau

Bekanntes Mitglied
japp, das stimmt. Allerdings werden diese Mixed-Elemente nicht korrekt behandelt. Das war eingangs ja mein Problem
 
T

Tomate_Salat

Gast
ich habe ehrlich gesagt gerade nicht viel Ahnung, um was es hier in dem Thread geht. Habe ihn nur überflogen und gesehen, dass du von einer DTD ausgegangen bist und dann XSD kam. Da ich nix mehr von DTD gesehen habe, hatte ich meine randbemerkung gepostet ;-)
 

desperatedusch

Neues Mitglied
ok erstmal vielen dank für die vielen ratschläge. bin in der ganzen thematik noch nicht so firm und muss leider noch mal doof nachfragen.
in dem beispiel von mfernau werden mit @xmlelementrefs alle kindknoten mit @xmlelementref angeben?
 

Noctarius

Top Contributor
Am Besten baust du dir ein XSD das dein gewünschtes XML beschreibt und lässt dir die Klassen automatisch generieren. JAXB Annotations von Hand setzen ist ätzend.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
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 und verschachtelte Elemente? XML & JSON 6
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
aze JaxB Elemente in LinkedHashSet werden nicht wiededergegeben XML & JSON 3
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