Ссылочный атрибут или тип атрибута в XSD - PullRequest
5 голосов
/ 21 марта 2012

Я видел такой образец:

<xsd:element name="Product">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ProductName" type="xsd:string" />
            <xsd:element name="Customer" type="xsd:CustomerType" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:element name="CustomerType">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="FullName" type="xsd:string" />
            <xsd:element name="Age" type="xsd:string" />
            <xsd:element name="Age" type="xsd:occupation" />
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>

И мне интересно, почему кто-то выбрал один type вместо ref в таком случае:

<xsd:element name="Product">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ProductName" type="xsd:string" />
            <xsd:element ref="Customer" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:element name="Customer">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="FullName" type="xsd:string" />
            <xsd:element name="Age" type="xsd:string" />
            <xsd:element name="Age" type="xsd:occupation" />
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Какая была бы положительная сторона использования Type вместо ref, кто-нибудь может мне объяснить? Я знаю, что ref также может иметь опции minOccurs и maxOccurs, так что вы можете определить ref как массивы в десериализованном коде.

1 Ответ

5 голосов
/ 21 марта 2012

Есть много способов взглянуть на это.Я предполагаю, что все это началось с некоторых основных принципов, таких как последовательность в авторском стиле.Оттуда люди начали анализировать последствия того, как делать так или иначе;были названы имена: русская кукла, кусочек салями, жалюзи, райский сад.Если вы хотите узнать больше, поиск по стилям разработки XSD, также называемым шаблонами проектирования для XSD, даст множество сайтов, посвященных этой теме.Это ссылка и это довольно хорошие ссылки типа фаст-фуда, с которых я бы начал ... Хотя я не согласен с некоторыми утверждениями, например contains only one global element (поэтому, если я определю схему rq / rs для веб-службы, я не буду согласен?) В целом это хороший старт.

В вашем случае последовательное определение моделей контента на основе ссылокelements это указание на шаблон «ломтик салями»: все элементы глобальные, типы локальные (анонимные).Первое следствие - то, что нельзя избавиться от пространства имен, связанного с тегом.

Не использование ссылочных элементов, а использование локальных определений с типами, которые являются глобальными, указывает на шаблон «жалюзи».В соответствии с приведенным выше комментарием к пространству имен, с этим подходом теперь возможно управлять пространствами имен, устанавливая атрибут elementFormDefault в элементе схемы.

minOccurs / maxOccurs, которые связаны с частицами, здесь не имеет значения.Для глобального элемента эти атрибуты не применяются.Для частиц модели содержимого, элементов одного вида, независимо от того, является ли элемент ref ed или локальным, это не имеет значения.

...