如何使用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; }