XSD属性和抽象

时间:2009-08-31 16:02:54

标签: java xsd jaxb

我有一个Line< - SPLine,Line< - DID_Line Line< - TollFree等层次结构。然后,对于每一行,都有一种动作。所以我在xsd中看起来像这样:

<xsd:complexType name="line" abstract="true">
    <xsd:complexContent>
        <xsd:extension base="tns:executable">
            <xsd:sequence>
                ...
            </xsd:sequence>
            <xsd:attribute name="type" type="tns:line_type" />
            <xsd:attribute name="switch_type" type="tns:switch_type" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="toll_free">
    <xsd:complexContent>
        <xsd:extension base="tns:line">
            <xsd:sequence>
                ...
            </xsd:sequence>
            <xsd:attribute name="action" type="tns:basic_actions" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="did_line">
    <xsd:complexContent>
        <xsd:extension base="tns:line">
            <xsd:attribute name="action" type="tns:suspendable_actions"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="spLine">
    <xsd:complexContent>
        <xsd:extension base="tns:line">
            <xsd:attribute name="action" type="tns:suspendable_actions" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
<xsd:simpleType name="line_action" >
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="add" />
        <xsd:enumeration value="delete">
        </xsd:enumeration>
        <xsd:enumeration value="remove">
        <xsd:enumeration value="suspend" />
        <xsd:enumeration value="restore" />
        <xsd:enumeration value="update" />
    </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="basic_actions">
    <xsd:restriction base="tns:line_action">
        <xsd:enumeration value="add" />
        <xsd:enumeration value="remove" />
    </xsd:restriction>
</xsd:simpleType>

还有更多动作类型和行类型。但是我的我的问题是为了采取行动我必须做的所有演员。所以,让我们说有人给我发送一个样条曲线,我想得到这个动作,web服务接受一个行对象,所以我采取该行对象检查类型,然后进行适当的转换。我想将action属性移动到line然后消除强制转换。我能看到的唯一能做的就是:

                                                                                                    

                                                                                                              

                                                          

                                      ...                                                                                               

<xsd:complexType name="toll_free">
    <xsd:complexContent>
        <xsd:extension base="tns:line">
            <xsd:sequence>...
            </xsd:sequence>
            <xsd:attribute ref="tns:basic_actions" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

但这只是给了我一些额外的方法,我仍然需要演员。那么我怎样才能使这个多态方法工作,我只能说line.getAction,它将调用子类来返回已设置的动作。如果我必须将属性转换为一个很好的元素。

1 个答案:

答案 0 :(得分:0)

如果您想要为每个子类型设置一组不同的限制,则需要进行强制转换。您可以从XSD中删除限制(仅将它们保存在代码中),然后将属性定义放在行类型中。