Wie wird der Nullwert als leeres Element mit JAXB dargestellt?

8

Meine XSD Struktur ist wie folgt: -

%Vor%

Wenn ich den Null-Wert in diesem Feld einstelle, erlaube ich es, aber zu der Zeit von XML Generation von JAXB Marshalling erstelle ich die Ausgabe mit

%Vor%

Im Ergebnis möchte ich die Ausgabe als <XYZDate/> ausgeben, d. h. das Schema und andere Attribute nicht wollen.
Ich entferne das mit Hilfe von XMLStreamWriter , aber es produziert die komplette XML in Einzellinie. Ich brauche wohl formatiertes XML . Wenn ich IndentingXMLStreamWriter verwenden muss, kann meine Java Version es nicht unterstützen und ich habe keine Kontrolle über Java Container, um sie zu ändern oder zu ändern.

Bitte schlagen Sie eine Lösung vor, um XML gut formatiert zu bilden.

    
Amit Telang 31.07.2012, 15:12
quelle

3 Antworten

14

HINWEIS # 1: Ich bin der EclipseLink JAXB (MOXy) Leitung und Mitglied der JAXB (JSR-222) Expertengruppe.

HINWEIS # 2: Die Ausgabe, die Sie sehen, stimmt mit dem überein, was Sie mit JAXB zugeordnet haben. Für weitere Informationen siehe:

REPRÄSENTIEREN VON NULL ALS EIN LEERES ELEMENT

Wenn Sie null als leeres Element darstellen möchten, gibt es ein paar Optionen.

Option # 1 - Verwenden der Standard-JAXB-APIs

DatumAdapter

Sie können XmlAdapter verwenden, um die Art und Weise zu ändern, in der eine Instanz von Date in XML gemarshallt wird. Wir werden das Datum in eine Instanz einer Klasse umwandeln, der eine Eigenschaft mit @XmlValue zugeordnet ist (siehe Ссылка ). Der JAXB RI ruft den Mechanismus XmlAdapter nicht für Nullwerte auf, daher müssen Sie ein JAXB-Impl verwenden, das beispielsweise MOXy verwendet.

%Vor%

Stamm

% ce_de% wird mit der Annotation XmlAdapter referenziert.

%Vor%

Option # 2 - Verwenden der MOXy @ XmlNullPolicy-Erweiterung

MOXy bietet eine Erweiterung @XmlJavaTypeAdapter , die Ihnen eine gewisse Flexibilität bei der Darstellung von null bietet.

%Vor%

Andere Dateien

Die folgenden Dateien können mit beiden Optionen verwendet werden, um das Beispiel zu vervollständigen.

jaxb.properties

Um MOXy als Ihren JAXB-Provider anzugeben, müssen Sie eine Datei mit dem Namen @XmlNullPolicy in dasselbe Paket wie Ihr Domänenmodell mit dem folgenden Eintrag einfügen (siehe: Blaise Doughan 31.07.2012 20:42

quelle
3

Sie sollten die Nillable- und minOccurs XSD-Elementattribute lesen, da der Unterschied zwischen nil und ein empty -Element ist signifikant in XML . h. xsi:nil=true ist ähnlich wie SQL NULL , aber ein leeres Element repräsentiert die Geschenke eines leeren Elements. :)
Ich weiß, es ist verwirrend.

Um Ihr spezifisches Problem zu beheben, wenn Sie JAXB serialization verwenden, um das zu generieren, empfehle ich das Lesen von So instanziieren Sie ein leeres Element mit JAXB . Die Frage selbst zeigt Ihnen, wie Sie ein leeres Element generieren.

    
gbvb 31.07.2012 16:30
quelle
1

Ich habe die Antwort von gbvb gewählt.

Ich verstehe nicht, warum willst du das aber.

Das leere Element mit xmlns:xsi und xsi:nil ist der richtige Weg.

Ohne diese Attribute wird reasonable Parser Ihnen die leere Zeichenfolge even if the element is self-closed geben.

Angenommen, Sie möchten den Kunden einen ganzzahligen Wert geben, der die höchste Punktzahl in vielen Spielergebnissen bedeutet.

Wenn Sie berechnen können, können Sie den richtigen Wert angeben. Wenn es noch keinen Spieler gibt, der tatsächlich gewertet hat, sollten Sie den richtigen Wert als NULL oder nil eingeben, was bedeutet, dass kein Datensatz angesammelt wurde.

%Vor%

Man kann sagen, die höchste Punktzahl ist 98 von 128 Versuchen.

Und

%Vor%

Man kann sagen, dass es keine Höchstpunktzahl gibt, weil keine Punkte aufgezeichnet wurden.

Aber

%Vor%

Bedeutet nichts anderes als ein einfaches selbst geschlossenes leeres Element.

    
Jin Kwon 03.08.2012 12:51
quelle

Tags und Links