Inheritance 用JAXB解组继承结构
我想使用JAXB解组以下XML结构:Inheritance 用JAXB解组继承结构,inheritance,jaxb,unmarshalling,Inheritance,Jaxb,Unmarshalling,我想使用JAXB解组以下XML结构: <orCondition> <andCondition> <andCondition> <simpleCondition value="val1" /> <simpleCondition value="val2" /> </andCondition> <simpleCondition value="val3
<orCondition>
<andCondition>
<andCondition>
<simpleCondition value="val1" />
<simpleCondition value="val2" />
</andCondition>
<simpleCondition value="val3" />
</andCondition>
<simpleCondition value="val4" />
</orCondition>
包含两个条件的复合类
@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;
}
或条件
@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;
}
简单叶类条件
@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;
它在解组后保持为空。对象的其余部分将很好
奇怪的建议?或者这是不可能的?您可以像这样构建您的模型: 综合
package forum9006785;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "simpleCondition")
public class Simple extends Condition {
@XmlAttribute
String value;
}
您可以将复合
类更改为如下所示,并使用@xmlementref
注释@xmlementref
对应于替换组的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
进行注释。它充当@xmlementref
属性的类型标识符
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>
您可以按照以下方式构建您的模型:
综合
package forum9006785;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "simpleCondition")
public class Simple extends Condition {
@XmlAttribute
String value;
}
您可以将复合
类更改为如下所示,并使用@xmlementref
注释@xmlementref
对应于替换组的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
进行注释。它充当@xmlementref
属性的类型标识符
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>
什么是“不起作用”呢?对不起。我在另一个类中有一个实例变量如下:@xmlement(name=“condition”,type=condition.class)private condition;它在解组后保持为空。对象的其余部分很好。“不工作”是什么意思?对不起。我在另一个类中有一个实例变量如下:@xmlement(name=“condition”,type=condition.class)private condition;它在解组后保持为空。对象的其余部分将很好。