如何使用JAXB实例化一个空元素

我使用JAXB来创建XML消息。 我需要创建的XML(为简单起见):

 

我的代码如下所示:

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

问题:不显示header元素(header为null )。 当标头设置为空字符串时,将显示以下内容:

  

当我使用Object而不是String类型时,结果更糟:

  

BTW:我正在使用此代码来创建XML字符串。

是否可以获得空标签?

在XML中,

是一回事。 如果你真的想要前者,那就使用美化剂。 javax.xml.transform.TransformerFactory.newTransformer()可能会为您做到这一点。

String对象的空标记本质上是空字符串。

如果您拨打以下电话,您将获得所需内容:

 request.setHeader("") 

我还应该注意到,在XML中,标题的以下两个声明是完美的。 这两个都没有子文本节点。 这些基本相同,所有XML解析器都将对它们进行相同的处理:

 

正如@Tom Hawtin – 强调说

是一样的。 解析器会给你“”。

您必须在标题注释上添加nillable

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

我希望这段代码会为null值生成以下XML。

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

版画

   

在xml序列化过程中,我想要同样的东西,实际上是

而不是

由于空值 – 而不是空字符串 – 将产生正确的结果,我修改了我的setter方法以将值显式设置为null:

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