我正在使用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>
答案 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
的有效表示。