使用JAXB解组继承结构

时间:2012-01-25 17:03:34

标签: inheritance jaxb unmarshalling

我想使用JAXB解组以下XML结构:

<orCondition>
    <andCondition>
      <andCondition>
        <simpleCondition value="val1" />
        <simpleCondition value="val2" />
      </andCondition>
      <simpleCondition value="val3" />
    </andCondition>
    <simpleCondition value="val4" />
</orCondition>

我有以下Java类:

条件基类

@XmlType(name="condition")
public class Condition {

}

包含两个条件的复合类

@XmlType(name="composite")
public class Composite extends Condition {

    @XmlElement(name = "condition", type = Condition.class)
    private Condition firstCondition;

    @XmlElement(name = "condition", type = Condition.class)
    private Condition secondCondition;

    public Condition getFirstCondition() {
        return firstCondition;
    }

    public void setFirstCondition(Condition firstCondition) {
        this.firstCondition = firstCondition;
    }

    public Condition getSecondCondition() {
        return secondCondition;
    }

    public void setSecondCondition(Condition secondCondition) {
        this.secondCondition = secondCondition;
    }
}

条件

@XmlType(name = "andCondition")
public class And extends Composite {

}

或条件

@XmlType(name = "orCondition")
public class Or extends Composite {

}

简单的叶类条件

@XmlType(name = "simpleCondition")
public class Simple extends Condition {

    @XmlAttribute
    String value;
}

这不起作用。我在另一个类中有一个实例变量,如下所示:

@XmlElement(name = "condition", type = Condition.class) 
private Condition condition; 

解组后它保持为空。对象的其余部分解组很好

Anny的建议?或者这不可能吗?

1 个答案:

答案 0 :(得分:1)

您可以将模型构建为:

<强>组合

您可以将Composite类更改为类似以下内容并使用@XmlElementRef注释。 @XmlElementRef对应于替换组的XML模式概念:

package forum9006785;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Composite extends Condition {

    @XmlElementRef
    private Condition[] condition = new Condition[2];

    public Condition getFirstCondition() {
        return condition[0];
    }

    public void setFirstCondition(Condition firstCondition) {
        condition[0] = firstCondition;
    }

    public Condition getSecondCondition() {
        return condition[1];
    }

    public void setSecondCondition(Condition secondCondition) {
        condition[1] = secondCondition;
    }

}

<强>条件

package forum9006785;

public class Condition {

}

对于可以出现在XML中的每个子类,您需要使用@XmlRootElement进行注释。这充当@XmlElementRef属性的类型标识符。

package forum9006785;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "andCondition")
public class And extends Composite {

}

package forum9006785;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "orCondition")
public class Or extends Composite {

}

<强>简单

package forum9006785;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "simpleCondition")
public class Simple extends Condition {

    @XmlAttribute
    String value;

}

<强>演示

package forum9006785;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        File xml = new File("src/forum9006785/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Condition condition = (Condition) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(condition, System.out);
    }

}

<强>输入/输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<orCondition>
    <andCondition>
        <andCondition>
            <simpleCondition value="val1"/>
            <simpleCondition value="val2"/>
        </andCondition>
        <simpleCondition value="val3"/>
    </andCondition>
    <simpleCondition value="val4"/>
</orCondition>

了解更多信息