12

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

<request>
  <header/>
</request>

我的代码如下所示:

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元素未显示(标题为null)。当 header 设置为空字符串时,将显示以下内容:

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

当我使用 as typeObject而不是 时String,结果更糟:

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

顺便说一句:我正在使用此代码来创建 XML 字符串。

是否有可能获得一个空标签?

4

4 回答 4

12

在 XML 中,<header/><header></header>都是一回事。如果您真的想要前者,请使用美化剂。javax.xml.transform.TransformerFactory.newTransformer()可能会为你做到这一点。

于 2009-02-27T13:20:43.960 回答
4

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

如果您拨打以下电话,您将得到您正在寻找的东西:

request.setHeader("")

我还应该注意,在 XML 中,以下两个标头声明是相同的。这两个都没有子文本节点。这些本质上是相同的,并且所有 XML 解析器都会以相同的方式对待它们:

<header></header>

<header/>
于 2009-02-27T15:25:53.360 回答
2

正如@Tom Hawtin - tackline 所说

<header/>并且<header></header>是一样的。解析器会给你“”。

您必须添加nillable标题注释

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

我希望这段代码将生成以下 XML 以获取null价值。

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 version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
    <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</request>
于 2012-06-27T16:38:34.027 回答
0

我想要同样的东西,<header/>而不是<header></header> 在 xml 序列化过程中。

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

public void setHeader(String header) {
    this.header = "".equals(header) ? null : header;
}
于 2015-07-09T00:28:16.883 回答