JAXB解组使用列表,但不使用显式属性

时间:2014-10-03 19:13:00

标签: inheritance jaxb

我正在开发一个程序,它将一阶逻辑中的公式表示为Java类。我希望能够用XML表示一个公式,并使用JAXB来实例化一个WFF对象。

对象层次结构

WFF中最通用的对象是抽象类Symbol。所有符号都有UUID,可以是WFF或条款。

术语是由最终的类公式扩展的抽象类,它具有一个arity和一个术语列表。它也被最终的类变量扩展,它只有一个String名称。

WFF是由Connective,Quantifier和Relation扩展的抽象类。其中的每一个都通过具体类型扩展,如Connective {And,Or,Not},Quantifier {Universal,Existential},RelationIn。

示例XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<relationIn>
    <function name="inv">
        <variable name="X"/>
    </function>
    <variable name="X"/>
</relationIn>

示例类

@XmlRootElement
public final class RelationIn extends Relation {    


    @XmlElementRef
    private Term t1;
    @XmlElementRef
    private Term t2;

    @SuppressWarnings("unused")
    private RelationIn() {
        this(null,null);
    }

    public RelationIn(Term t1, Term t2) {
        super();
        this.t1 = t1;
        this.t2 = t2;
    }

    @Override
    public WFF copy() {
        return new RelationIn(t1, t2);
    }

}

**输出**

将XML解组为WFF,然后打印编组对象的结果,结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<relationIn id="aa348148-3e68-4540-9508-a2328b29acef">
    <variable name="X" id="951ce047-4bbe-40ad-a10e-e8bc94200aab"/>
</relationIn>

由于某种原因,t1始终是xml中的第二个元素,并且t2在对象中始终为null(通过调试证明,所以我知道问题不在于编组)。如果我交换顺序,t1将是一个函数,t2仍然是null。我尝试过添加@XmlType(proporder = {&#34; t1&#34;,&#34; t2&#34;}),没有快乐。

但是,如果我改为使用单个条款列表,例如

@XmlElementRef
private List<Term> t;

正确创建对象,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<relationIn id="80b21dec-f3f1-4871-9006-996e4cb2e1dc">
    <function name="inv" id="d7f80fca-ac6b-4785-9193-ba3d54e0cfa0">
        <variable name="X" id="cf9683f9-1d20-4b8a-aa40-121712426774"/>
    </function>
    <variable name="X" id="33961b28-37f3-45c5-b72a-e7265b3cd808"/>
</relationIn>

这很棒,但如果可能的话,我希望只有两个条款而不是条款集合。我有什么明显的遗失吗?任何见解都将非常感激,如有必要,我可以提供更多代码。

1 个答案:

答案 0 :(得分:1)

JAXB期望每个属性对应XML中的唯一元素名称,不能基于位置进行映射。这就是为什么只有一个属性填充了数据。