如何使用JAXB将空元素解组为空字符串

时间:2011-06-21 06:41:38

标签: jaxb marshalling element unmarshalling

有一个像这样的伪代码:

Alma alma = new Alma();
alma.setKorte(""); //Korte is a string member
marshaller.marshal(alma, stringwriter);
System.out.println(stringwriter.toString());

它产生的输出(我知道这是空元素存在的某种技巧,但这就是它在我的系统中的工作原理,所以有人在我之前设置了这个):

<alma><korte/></alma>

哪个对我好。但是当我解组时,空字符串没有被正确解组,但是korte将为null。如何让jaxb将空元素解组成空字符串?

我使用JDK6捆绑的jaxb。

编辑:

alma类看起来像(类的名称已更改,但它是这样的):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Alma", propOrder = {
    "korte"
})
public class Alma
    implements Serializable
{

    private final static long serialVersionUID = 100L;
    @XmlElement(required = true)
    protected String korte;

1 个答案:

答案 0 :(得分:1)

JAXB实现应该将空元素解组为String属性的“”。解决方案是升级到包含此修复程序的JAXB实现的更新版本。

以下示例使用JDK 1.6.0_20和EcliseLink JAXB (MOXy) 2.3中包含的JAXB版本为我工作。

<强>演示

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Alma.class);

        String xmlString = "<alma><korte/></alma>";
        StringReader xmlReader = new StringReader(xmlString);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Alma alma = (Alma) unmarshaller.unmarshal(xmlReader);

        System.out.println(alma.getKorte().length());
    }

}

<强>输出

0

<强>阿尔玛

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(name = "Alma", propOrder = { "korte" })
public class Alma implements Serializable {

    private final static long serialVersionUID = 100L;

    @XmlElement(required = true)
    protected String korte;

    public String getKorte() {
        return korte;
    }

    public void setKorte(String korte) {
        this.korte = korte;
    }

}