XSD: вложенные типы против глобальных типов - PullRequest
6 голосов
/ 02 сентября 2008

При определении XSD вы можете выбрать определение типов как вложенные типы или глобальные типы (complexType).

Я понимаю, что глобальные типы гораздо полезнее, когда речь идет о морфизме или повторном использовании элементов.

Однако, если у вас есть большая модель данных, вам нужно будет определить для каждого уровня глобальный complexType, а затем создать элемент, который ссылается на глобальный тип.

Вложенные

<xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="firstname"/>
                            <xs:element name="lastname"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="address">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="street"/>
                            <xs:element name="city"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>

Global

<xs:element name="person">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="name" type="nameType"/>
            <xs:element name="address" type="addressType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="nameType">
    <xs:sequence>
        <xs:element name="firstname"/>
        <xs:element name="lastname"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="addressType">
    <xs:sequence>
        <xs:element name="street"/>
        <xs:element name="city"/>
    </xs:sequence>
</xs:complexType>

Следовательно, мой вопрос: когда вы используете вложенные типы вместо того, чтобы делать их глобальными?

Для всех, кто интересуется: Мой вопрос как-то относится к этому вопросу ( Атрибут XML против элемента ).

1 Ответ

6 голосов
/ 02 сентября 2008

В приведенном примере нет реальной разницы между этими двумя - и нет существенных преимуществ или недостатков ни для одного из них.

Однако в более крупных схемах вещи могут стать очень неопрятными и трудными для управления, когда практика выбора вложенной над глобальной неясно определена.

Очевидные причины использования глобальных типов (в основном повторное использование, а также вложение) имеют тенденцию диктовать - в общем, я предпочитаю тот или иной режим. То есть если вы повторно используете некоторые сложные типы, но не другие, сделайте их глобальными. Если вы ничего не используете, сделайте их вложенными.

Исключением из этого (и это то, с чем я часто сталкивался) является то, что определение типов составляет основную часть сложности (!) Вашей схемы, а их содержание относительно просто. В этом случае, независимо от того, используются ли они повторно, я бы порекомендовал сделать их глобальными, поскольку реструктурировать / переупорядочить документ намного проще, когда вам не нужно разбираться с массивными определениями complexType. Они также теоретически более портативны.

Существуют также случаи, когда вы не можете получить определенные структуры документов с вложенными типами - примером этого является использование двух complexTypes в последовательности, которая может содержать от 0 до неограниченных экземпляров каждого типа в любом смешанном порядке. Это невозможно для вложенных типов, но для глобальных типов, на которые имеются ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...