XSD атрибуты и аннотация - PullRequest
       8

XSD атрибуты и аннотация

0 голосов
/ 31 августа 2009

У меня есть иерархия Line <- SPLine, Line <- DID_Line Line <- TollFree и т. Д. Затем для каждой строки есть тип действия. Так у меня это выглядит в xsd: </p>

<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>

Из них есть больше типов действий и типов линий. Но моя проблема - все, что я должен сделать, чтобы получить действие. Допустим, кто-то отправил мне сплайн, и я хочу получить действие, веб-служба принимает линейные объекты, поэтому я беру этот линейный объект, проверяю тип и затем выполняю соответствующее приведение. Я хотел бы просто переместить атрибут действия в строку, а затем исключить приведение. Единственное, что я могу видеть, что я могу сделать, это:

...

<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 голосов
/ 01 сентября 2009

Если вы хотите иметь другой набор ограничений для каждого подтипа, вам нужно разыграть. Вы можете удалить ограничения из XSD (сохранить их только в коде) и затем поместить определение атрибута в тип строки.

...