Inheritance 用JAXB解组继承结构

Inheritance 用JAXB解组继承结构,inheritance,jaxb,unmarshalling,Inheritance,Jaxb,Unmarshalling,我想使用JAXB解组以下XML结构: <orCondition> <andCondition> <andCondition> <simpleCondition value="val1" /> <simpleCondition value="val2" /> </andCondition> <simpleCondition value="val3

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

<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;它在解组后保持为空。对象的其余部分将很好。