我想使用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的建议?或者这不可能吗?
答案 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>
了解更多信息