Существует два разных подхода к разработке XML-схемы:
- Использование анонимных complexTypes
- Использование именованных complexTypes
Мой вопрос: какой из них лучше?
Я считаю второй вариант лучше, потому что он позволяет избежать глубокого вложения и позволяет повторно использовать существующие типы. Это ближе к лучшим практикам разработки программного обеспечения. Но я увидел эту страницу , и теперь я в замешательстве:
Вот некоторые НЕ.
- НЕ пытайтесь быть мастером XML-схемы. Это займет месяцы.
- НЕ используйте сложные типы, объявления атрибутов и нотации.
- НЕ используйте локальные объявления.
- НЕ используйте группы подстановки.
- НЕ используйте схему без атрибута targetNamespace (AKA
схема хамелеона.)
Дело в том, что вы ничего не потеряете, следуя этим НЕ, как
Остальная часть этой статьи демонстрирует.
Есть некоторые объяснения, но я не нахожу их хорошими. Но, наверное, я что-то упускаю ...
Если быть точным, я приведу вам примеры этих двух подходов. Примеры взяты со страницы W3Schools . В нем перечислены три метода, но я проигнорировал второй, так как он очень похож на первый.
Использование анонимных сложных типов:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Использование именованных complexTypes:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
<xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
<xs:sequence>
<xs:element name="name" type="stringtype"/>
<xs:element name="address" type="stringtype"/>
<xs:element name="city" type="stringtype"/>
<xs:element name="country" type="stringtype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
<xs:sequence>
<xs:element name="title" type="stringtype"/>
<xs:element name="note" type="stringtype" minOccurs="0"/>
<xs:element name="quantity" type="inttype"/>
<xs:element name="price" type="dectype"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="stringtype"/>
<xs:element name="shipto" type="shiptotype"/>
<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>
Спасибо!