区分xml / jaxb中的空列表和空列表

时间:2019-05-09 13:34:24

标签: xml list null xsd jaxb

在Java,Json等中,您可以在对象属性中区分空列表和空列表。在XML中,它们通常都表示为“没有具有该属性名称的元素”,因此区别消失了。因此,在编组和解组Java对象时,此属性此后将始终有一个空列表。

例如,在基于xml的协议中描述更改时,区别特别重要,其中“ null”表示“请勿更改”,“空列表”表示“设置为空列表”。

所以问题是如何定义xsd和潜在的xjb(jaxb绑定)以定义能够区分两者的协议。

此类对象的普通xsd是

<complexType name="Object">
    <sequence>
        <element type="xs:string" name="id" minOccurs="0" maxOccurs="unbounded"/>
    <sequence>
</complexType>

这将创建类似Java代码

public List<String> getIds() {
    if (ids == null) {
        ids = new ArrayList<>();
    }
    return this.ids;
}

因此,显然getIds永远不会返回null。但这很显然是这样,因为没有两个不同的xml,因此会将null或空列表都编组到

<Object>
<Object>

所以我的第一个想法是使用nillable:

<complexType name="Object">
    <sequence>
        <element type="xs:string" name="id" 
            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
    <sequence>
</complexType>

然后,空列表将如上所述,但是null可以描述为

<Object>
    <id xsi:nil="true">
<Object>

但是,jaxb不尊重这一点,它将创建与上面相同的代码。

我的下一个ID是使用xsd列表类型:

<xs:simpleType name="IdListType">
    <xs:list itemType="xs:string"/>
</xs:simpleType>

对象描述为

<complexType name="Object">
    <sequence>
        <element type="IdListType" name="ids" minOccurs="0"/>
    <sequence>
</complexType>

然后,null可以写为

<Object>
<Object>

并以空白列表

<Object>
    <ids></ids>
<Object>

但是,jaxb只会创建与上面相同的代码,甚至不会为IdListType创建Java类。

所以我只能使用类似的复杂列表数据类型

<complexType name=IdListType>
    <sequence>
        <element name="id" type="xs:string" minOccurs="0" maxOccurs="unbounded">
    </sequence>
</complexType>

对象xsd如上。这会起作用,但是会在生成的代码以及协议中的线路上创建大量样板代码。

所以我的问题是:是否有一种更简单的方法,也许会使jaxb兑现所列xsds之一中的区别?

0 个答案:

没有答案