Подходы к разработке XML-схемы - PullRequest
0 голосов
/ 16 августа 2011

Существует два разных подхода к разработке XML-схемы:

  1. Использование анонимных complexTypes
  2. Использование именованных 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>

Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Но я видел эту страницу , и теперь я в замешательстве ...

Не позволяйте этой странице повлиять на ваше решение.Он был написан почти десять лет назад (февраль 2002 года, согласно Wayback Machine ), когда XML-схема была новой, пугающей и плохо поддерживаемой.Я немного поработал с автором и знаю, что он очень резок и прагматичен;однако, я думаю, что документ был направлен на людей, которые посчитали XML-схему пугающей и плохо поддерживаемой и дали им шпаргалку для использования XML-схемы с минимальными затратами.

2 голосов
/ 17 августа 2011

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

Рекомендации по проектированию Kawaguchi ничего не говорят о том, как схема предназначена для использования. Если вы хотите использовать схему только для проверки, это одно; если вы хотите использовать его для привязки данных в C # или Java, это другое; если вы хотите использовать его для написания XSLT и XPath с учетом схемы, это еще один ряд соображений. Честно говоря, я нахожу его совет немного поверхностным.

1 голос
/ 21 августа 2011

XML-схемы удовлетворяют различным возможным потребностям, таким как привязка данных, безопасная обработка типов, проверка или определение интерфейса.Ваш подход к разработке схемы должен отражать ваши приоритеты.

Например, наличие именованных типов важно для расширенного использования, например, если вы хотите использовать обработку XML с учетом схемы в XQuery или XSLT, но менее важно, если вынужна схема только для проверки.

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