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

时间:2009-02-27 12:22:29

标签: java xml jaxb

我使用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)。当标头设置为空字符串时,将显示以下内容:

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

当我使用Object类型代替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>

BTW:我正在使用this code来创建XML字符串。

是否可以获得空标签?

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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

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

request.setHeader("")

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

<header></header>

<header/>

答案 2 :(得分:2)

@Tom Hawtin - 强调说道

<header/><header></header>相同。解析器会给你“”。

您必须将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 version="1.0" encoding="UTF-8" standalone="yes"?>
<request>
    <header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</request>

答案 3 :(得分:0)

我想要同样的事情,有效SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); final int searchBarId = searchView.getContext().getResources().getIdentifier("android:id/search_bar", null, null); LinearLayout searchBar = (LinearLayout) searchView.findViewById(searchBarId); searchBar.setLayoutTransition(new LayoutTransition()); 而不是<header/> 在xml序列化过程中。

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

<header></header>