2009-02-27 15 views
8

Io uso JAXB per creare messaggi XML. L'XML Ho bisogno di creare è (per semplicità):Come istanziare un elemento vuoto con JAXB

<request> 
    <header/> 
</request> 

Il mio codice è simile al seguente:

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; 
    } 
} 

Il problema: l'elemento header non viene visualizzato (intestazione è null). Quando intestazione è impostato su una stringa vuota, viene visualizzato il seguente:

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

Quando uso come tipo Object invece di String, il risultato è anche peggiore:

<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: sto usando this code per creare la stringa XML.

È possibile ottenere un tag vuoto?

+0

Così che cosa è sbagliato con l'impostazione di testa a "" ? –

+0

Voglio

e non
. – doekman

+0

@doekman Ehm, so che è tardi, ma per ogni evenienza. Per ESATTAMENTE quello che vuoi, puoi usare l'implementazione [EclipseLink MOXy] (http://www.eclipse.org/eclipselink/moxy.php) di JAXB, che ha un'estensione molto bella '@ XmlNullPolicy'. Guarda un esempio [qui] (http://stackoverflow.com/a/11748678/814702) (nella sezione "Opzione n. 2") – informatik01

risposta

11

In XML, <header/> e <header></header> sono la stessa cosa. Se vuoi veramente il primo, usa un prettifier. javax.xml.transform.TransformerFactory.newTransformer() probabilmente lo farà per te.

+4

Ciao @ Tom. Potresti spiegare un po 'di più nei dettagli come farlo? – Vladimir

2

Un tag vuoto per un oggetto String è essenzialmente la stringa vuota.

Se si chiama il seguente, si ottiene quello che stai cercando:

request.setHeader("") 

Vorrei anche notare che in XML seguenti due dichiarazioni di un colpo di testa sono idential. Entrambi non hanno nodi di testo figlio. Questi sono essenzialmente la stessa e saranno trattati allo stesso modo da tutti i parser XML:

<header></header> 

<header/> 
2

Come @ Tom Hawtin - tackline detto

<header/> e <header></header> è lo stesso. I parser ti daranno "".

dovete mettere nillable sul colpo di testa di annotazione

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

Spero che questo codice genererà seguente codice XML per null valore.

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; 
} 

stampe

<?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

ho voluto la stessa cosa, in modo efficace <header/> piuttosto che <header></header> durante il processo di serializzazione XML.

Dal momento che un valore nullo - piuttosto che una stringa vuota - produrrà il risultato corretto, ho modificato il mio metodo setter per impostare il valore in modo esplicito su null:

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