使用JAXB根据Attribute将XML解组到不同的对象

时间:2016-01-21 14:27:31

标签: java xml jaxb

我正在尝试解组以下XML:

<calcElement partname="driver">
    <driverXs>300.00</driverXs>
    <seq>1</seq>
</calcElement>
<calcElement partname="ratingData">
    <baseMiles>6000</baseMiles>
    <vehicleGroup>15</vehicleGroup>
    <documentVersion>4</documentVersion>
</calcElement>

我有以下类,它们代表上面2个calcElement实例:

public abstract class CalcElement {

    private String partName;

    @XmlAttribute
    public String getPartName() {
        return partName;
    }

    public void setPartName(String partName) {
        this.partName = partName;
    }
}

public class DriverCalcElement extends CalcElement {
    private String driverXs;
    private String seq;

    public String getDriverXs() {
        return driverXs;
    }

    public void setDriverXs(String driverXs) {
        this.driverXs = driverXs;
    }

    public String getSeq() {
        return seq;
    }

    public void setSeq(String seq) {
        this.seq = seq;
    }
}

public class RatingDataCalcElement extends CalcElement {
    private String baseMiles;
    private String vehicleGroup;
    private String documentVersion;

    public String getBaseMiles() {
        return baseMiles;
    }

    public void setBaseMiles(String baseMiles) {
        this.baseMiles = baseMiles;
    }

    public String getVehicleGroup() {
        return vehicleGroup;
    }

    public void setVehicleGroup(String vehicleGroup) {
        this.vehicleGroup = vehicleGroup;
    }

    public String getDocumentVersion() {
        return documentVersion;
    }

    public void setDocumentVersion(String documentVersion) {
        this.documentVersion = documentVersion;
    }
}

但是我无法找到注释的组合来添加到类中以成功解组(和编组)此代码。

我需要在类中添加什么才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

JAXB本身不支持您尝试执行的操作。 XML Schema 1.1引入了一个类型替代的概念,您可以使用该元素的类型来确定元素的类型,使用该元素的属性值,但JAXB 2.x不支持此类基于XML Schema 1.0)。

您可以使用xsi:type对JAXB执行类似操作,但是您需要在磁盘上更改文档或进行转换(例如使用XSLT)以包含xsi:type属性,然后再将其传递给JAXB Unmarshaller。 xsi:type的值将是您使用注释指定的类型名称。有关如何计算类的类型名称,请参阅@XmlType注释。