Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用JAXB实例化空元素_Java_Xml_Jaxb - Fatal编程技术网

Java 如何用JAXB实例化空元素

Java 如何用JAXB实例化空元素,java,xml,jaxb,Java,Xml,Jaxb,我使用JAXB创建XML消息。我需要创建的XML是(为了简单起见): 问题:未显示标题元素(标题为null)。当标题设置为空字符串时,将显示以下内容: <request> <header></header> </request> 顺便说一句:我正在使用创建XML字符串 有可能得到一个空标记吗?在XML中,和是一样的。如果你真的想要前者,那就用美容剂javax.xml.transform.TransformerFactory.newTransf

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

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

<request>
  <header></header>
</request>
顺便说一句:我正在使用创建XML字符串


有可能得到一个空标记吗?

在XML中,
是一样的。如果你真的想要前者,那就用美容剂
javax.xml.transform.TransformerFactory.newTransformer()
可能会为您这样做。

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

如果您拨打以下电话,您将得到您想要的:

request.setHeader("")
我还应该注意,在XML中,头的以下两个声明是相同的。这两个节点都没有子文本节点。它们本质上是相同的,所有XML解析器都将对它们进行相同的处理:

<header></header>

<header/>

正如@Tom Hawtin-tackline所说

是相同的。解析器将为您提供“”

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

@xmlement(nillable=true,required=true)
公共字符串getHeader(){
返回头;
}
我希望这段代码将为
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 version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
    <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</request>

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

由于空值(而不是空字符串)将生成正确的结果,因此我修改了setter方法,将值显式设置为空:

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

那么,将标题设置为“”有什么错呢?我想要而不是。@doekman Ehm,我知道已经晚了,但以防万一。要完全实现您想要的功能,可以使用JAXB的实现,它有一个非常好的扩展
@XmlNullPolicy
。参见示例(在“选项2”部分)Hi@Tom。你能详细解释一下怎么做吗?嗨,克里斯,如果你想为Boolean、biginger、BigDecimal等包装器对象创建一个空标记怎么办?显然,如果将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>
public void setHeader(String header) {
    this.header = "".equals(header) ? null : header;
}