更改java的nillable xml元素的输出格式

时间:2014-04-10 14:21:34

标签: java xml jaxb nullable

我正在使用java的jaxb从java对象创建XML文件。 我面临的问题恰恰相反:LinqToXml does not handle nillable elements as expected

简而言之:我想正确描述生成的xml文件中为空的成员。

我班上有以下成员

  @XmlElement (name = "order-detail", nillable = true)
  private String orderDetail;

如果我封送此类的实例,则生成的xml元素为

<order-detail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>

既然非技术人员正在阅读,也许还在操纵文件,我宁愿这样做

<order-detail />
因为我不想混淆他们。那我怎么能实现这个呢?

更新

使用空字符串而不是null

  @XmlElement (name = "order-detail", nillable = true)
  private String orderDetail = "";

产量

<order-detail></order-detail>

SSCCE

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public class Example
{
  public static void main(String[] args) throws JAXBException
  {
    Data data = new Data();
    JAXBContext context = JAXBContext.newInstance(Data.class);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.marshal(data, System.out);
  }

  @XmlRootElement(name = "data")
  static class Data
  {
    private String orderDetail;

    @XmlElement (name = "order-detail", nillable = true)
    public String getOrderDetail()                  { return orderDetail;             }
    public void setOrderDetail(String orderDetail)  { this.orderDetail = orderDetail; }
  }
}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data>
    <order-detail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</data>

1 个答案:

答案 0 :(得分:0)

JAXB将空字符串("")封送为空元素。您可以更改代码,以便当字段的值为("")时,属性会报告空值。

  @XmlRootElement(name = "data")
  static class Data
  {
    private String orderDetail = "";

    @XmlElement (name = "order-detail", nillable = true)
    public String getOrderDetail() {
        if(orderDetail.length() == 0) {
            return null;
        }
        return orderDetail;
    }
    public void setOrderDetail(String orderDetail)  { 
        if(null == orderDetail) {
            this.orderDetail = "";
        } else {
            this.orderDetail = orderDetail; 
        }
    }
  }

通常XmlAdapter用于“修复”值,但JAXB参考实现不会将XmlAdapter应用于null值。


注意

  

简而言之:我想正确地描述那些无效的成员   生成的xml文件。

任何空元素都不是XML中null的有效表示。