2009-02-27 7 views
8

Ich benutze JAXB, um XML-Nachrichten zu erstellen. Die XML-I erstellen müssen ist (aus Gründen der Einfachheit):So instanziieren Sie ein leeres Element mit JAXB

<request> 
    <header/> 
</request> 

Mein Code sieht wie folgt aus:

import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "request") 
public class Request { 

    private String header; 

    @XmlElement(required=true) 
    public String getHeader() { 
     return header; 
    } 

    public void setHeader(String header) { 
     this.header=header; 
    } 
} 

Das Problem: das header Element nicht angezeigt wird (Header ist null). Wenn die Header auf einen leeren String gesetzt ist, wird die folgende angezeigt:

<request> 
    <header></header> 
</request> 

Wenn ich als Typ verwenden Object statt String, ist das Ergebnis noch schlimmer:

<request> 
    <header xsi:type="xs:string" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></header> 
</request> 

BTW: Ich verwende this code zum Erstellen der XML-Zeichenfolge.

Ist es möglich, ein leeres Tag zu bekommen?

+0

Also, was mit der Einstellung Header falsch ist, „“ ? –

+0

Ich möchte

und nicht
. – doekman

+0

@doekman Ehm, ich weiß, es ist spät, aber nur für den Fall. GENAU, was Sie wollen, können Sie [EclipseLink MOXy] (http://www.eclipse.org/eclipselink/moxy.php) Implementierung von JAXB verwenden, die eine sehr schöne Erweiterung '@ XmlNullPolicy' hat. Sehen Sie ein Beispiel [hier] (http://stackoverflow.com/a/11748678/814702) (in der "Option # 2" Sektion) – informatik01

Antwort

11

In XML, <header/> und <header></header> sind die gleichen Dinge. Wenn Sie das erstere wirklich wollen, dann verwenden Sie einen Prettifier. javax.xml.transform.TransformerFactory.newTransformer() wird wahrscheinlich das für Sie tun.

+4

Hi @Tom. Könntest du ein bisschen mehr im Detail erklären, wie es geht? – Vladimir

2

Ein leeres Tag für ein String-Objekt ist im Wesentlichen die leere Zeichenfolge.

Wenn Sie den folgenden Aufruf, Sie bekommen, was Sie suchen:

request.setHeader("") 

Ich sollte auch beachten, dass in XML die folgenden zwei Erklärungen eines Kopf idential sind. Beide haben keine untergeordneten Textknoten. Dies sind im Wesentlichen die gleichen, und wird diese mit allen XML-Parser behandelt werden:

<header></header> 

<header/> 
2

Als @ Tom Hawtin - tackline sagte

<header/> und <header></header> gleich ist. Parser geben dir "".

Sie müssen nillable auf Ihrer Kopf Annotation folgende generiert XML für null Wert

@XmlElement(nillable=true, required=true) 
public String getHeader() { 
    return header; 
} 

ich diesen Code Hoffnung setzen.

import javax.xml.bind.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Request { 

    public static void main(String[] args) throws JAXBException { 
     final Request request = new Request(); 
     final JAXBContext context = JAXBContext.newInstance(Request.class); 
     final Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 
           Boolean.TRUE); 
     marshaller.marshal(request, System.out); 
     System.out.flush(); 
    } 

    @XmlElement(nillable=true, required=true) 
    private String header; 
} 

druckt

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<request> 
    <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
</request> 
0

wollte ich die gleiche Sache, effektiv <header/> statt <header></header> während der XML-Serialisierung.

Da ein Nullwert - anstatt ein leeres String - wird das richtige Ergebnis produzieren, modifizierte ich meine Setter-Methode den Wert explizit auf null zu setzen:

public void setHeader(String header) { 
    this.header = "".equals(header) ? null : header; 
}