2009-08-31 76 views
0

我有一个行的层次结构< --SPLine,行< --DID_Line行< -TollFree等。然后对于每一行有一种行动。所以我看起来像这样在xsd: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服务接受一个线对象,所以我接受这个线对象检查类型,然后进行相应的转换。我想只将行为属性移动到行,然后消除强制转换。我可以看到我能做的唯一的事情是这样的:

...

<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,它会调用子类来返回设置的动作。如果我必须将该属性转换为一个很好的元素。

回答

0

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