I use JAXB to create XML messages. The XML I need to create is (for the sake of simplicity):
An empty tag for a String object is essentially the empty string.
If you call the following, you will get what you are looking for:
request.setHeader("")
I should also note that in XML the following two declarations of a header are idential. Both of these have no child text nodes. These are essentially the same and will be treated the same by all XML parsers:
<header></header>
<header/>
As @Tom Hawtin - tackline said
<header/>
and <header></header>
is same. Parsers will give you "".
You have to to put nillable
on your header annotation
@XmlElement(nillable=true, required=true)
public String getHeader() {
return header;
}
I hope this code will generate following XML for null
value.
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;
}
prints
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
<header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</request>
In XML, <header/>
and <header></header>
are the same thing. If you really want the former, then use a prettifier. javax.xml.transform.TransformerFactory.newTransformer()
will probably do that for you.
I wanted the same thing, effectively <header/>
rather than <header></header>
during the xml serialization process.
Since a null value - rather than an empty string - will produce the correct result, I modified my setter method to set the value explicitly to null:
public void setHeader(String header) {
this.header = "".equals(header) ? null : header;
}