Журнал ВРМ World

Мировая история развития технологий управления эффективностью бизнеса – обзоры зарубежных публикаций

Руководство по XML: Разработка XML Schema

Эта статья, являющаяся фрагментом руководства по языку XML, дает краткий
обзор основных понятий и механизмов работы с XML Schema и приводит аргументы в
пользу использования XML Schema, как более прогрессивного решения в области
описания документов и данных, чем, например, DTD. Приводится пример
XML-документа, разбирается его полная схема и предлагается создание
собственного варианта для данного документа. Кроме того, статья содержит ряд
полезных ссылок, с помощью которых читатель может более детально ознакомиться
со спецификациями DTD, проверить синтаксис самостоятельно созданной схемы
XML-документа, потренироваться на готовых образцах XML-документов с
приложенными к ним схемами, а также обратиться к полному руководству по XML
ресурса Msdn Online.

Что такое XML Schema?

XML Schema- это описание разметки XML-документа сделанное в соответствии с синтаксисом XML. XML Schema - это спецификация, поддержанная фирмой Microsoft и имеющая множество преимуществ перед Document Type Definition (DTD), являющимся первоначальной спецификацией описания XML-модели. Спецификации DTD имеют множество недостатков, включая использование специального, отличного отXML синтаксиса, невозможность типизации данных и нерасширяемость. Например, спецификации DTD не позволяют вам определять содержание элемента как что-либо отличное от другого такого же элемента или строки. Чтобы лучше разобраться в спецификациях DTD, вы можете обратиться к Рекомендациям W3C XML. XML Schema превосходит DTD по всем параметрам, включая поддержку пространств имен (namespaces). Например, XML Schema позволяет вам определять элемент как integer, float, boolean, URL и др.

XML-парсер в Internet Explorer 5 может проверять XML-документ на допустимость как согласно DTD, так и XML-Schema. Как создать XML Schema?

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


<class xmlns="x-schema:classSchema.xml">
  <student studentID="13429">
    <name>James Smith</name>
    <GPA>3.8</GPA>
  </student>
</class>

Вы заметите в этом документе, что определено пространство имен по умолчанию "x-schema:classSchema.xml". Это помогает при проверке синтаксиса сравнить весь документ со схемой (x-schema) по следующему URL ("classSchema.xml").

Ниже приведена полная схема для данного документа. Она начинается с элемента Schema, содержащего описание пространства имен указанной схемы и, кроме того, в данном случае - еще и описание пространства имен типов данных. Первое, xmlns="urn:schemas-microsoft-com:xml-data", говорит о том, что данный XML-документ является схемой XML. Второе, xmlns:dt="urn:schemas-microsoft-com:datatypes", позволяет вам определять тип элемента и содержание атрибута с использованием префикса dt в атрибуте type в составе их определений ElementType и AttributeType.


<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <AttributeType name='studentID' dt:type='string' required='yes'/>
  <ElementType name='name' content='textOnly'/>
  <ElementType name='GPA' content='textOnly' dt:type='float'/>
  <ElementType name='student' content='mixed'>
    <attribute type='studentID'/>
    <element type='name'/>
    <element type='GPA'/>
  </ElementType>
  <ElementType name='class' content='eltOnly'>
    <element type='student'/>
  </ElementType>
</Schema>

Элементы описания, используемые вами для определения элементов и атрибутов, выглядят следующим образом:

  • ElementType: Присваивает тип и ограничивает значения элемента, а также определяет, какие дочерние элементы он может содержать, если таковые имеются.
  • AttributeType: Присваивает тип и ограничивает значения атрибута.
  • attribute: Определяет что ранее описанный тип атрибута может появиться в составе данного элемента ElementType.
  • element: Определяет, что ранее описанный тип элемента может появиться в составе данного элемента ElementType.

Содержание схемы начинается с объявления AttributeType и ElementType для элементов, имеющих наибольшую степень вложенности.


<AttributeType name='studentID' dt:type='string' required='yes'/>
<ElementType name='name' content='textOnly'>
<ElementType name='GPA' content='textOnly' dt:type='float'/>

Следующее объявление ElementType сопровождается его атрибутом и дочерними элементами. Когда элемент имеет атрибуты или дочерние элементы, все они должны быть включены в объявление ElementType. Кроме того, они должны быть заранее описаны в своих собственных объявлениях ElementType и AttributeType.


<ElementType name='student' content='mixed'>
<attribute type='studentID'/>
<element type='name'/>
<element type='GPA'/>
</ElementType>

Этот процесс выполняется для всей схемы, пока каждый элемент и атрибут не будут объявлены.

В противовес DTD, XML Schemas дают вам возможность иметь модель с открытым содержанием, позволяющую вам, например, задавать тип элементов или использовать значения по умолчанию без обязательных ограничений содержания.

В следующей схеме определен тип элемента GPA и ему присвоен атрибут со значением, заданным по умолчанию, но кроме этого никакие другие узлы элемента student не объявлены.


<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <AttributeType name="scale" default="4.0"/>
  <ElementType name="GPA" content="textOnly" dt:type="float">
    <attribute type="scale"/>
  </ElementType>
  <AttributeType name="studentID"/>
  <ElementType name="student" content="eltOnly" model="open" order="many">
    <attribute type="studentID"/>
    <element type="GPA"/>
  </ElementType>
</Schema>

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

Попробуйте!

Попробуйте создать схему следующего документа.


<order>
  <customer>
    <name>Fidelma McGinn</name>
    <phone_number>425-655-3393</phone_number>
  </customer>
  <item>
    <number>5523918</number>
    <description>shovel</description>
    <price>39.99<price>
  </item>
  <date_of_purchase>1998-10-23</date_of_purchase>
  <date_of_delivery>1998-11-03</date_of_delivery>
</order>

Как только вы закончите эту схему, проверьте ее через XML validator.

Download MSDN Online обеспечивает набор примеров XML-файлов, включая документ XML с приложенной схемой. Загрузите эти примеры и попробуйте манипулировать документом и схемой. Для проверки правильности вашего XML относительно схемы, вы можете загрузить документ через XML Validator или просто просмотреть XML-файл в Mime Type Viewer.

Некоторые соображения:

  • Объявления ElementType и AttributeType должны предшествовать определениям содержания attribute и element, относящихся к этим типам. Например, вышеприведенная схема, определение ElementType для элемента GPA должна предшествовать определению ElementType для элемента student.
  • Значение по умолчанию атрибута order зависит от значение атрибута content. Когда содержание установлено как "eltOnly," порядок имеет значение по умолчанию seq. Когда содержание определено как mixed, порядок имеет значение по умолчанию many. За дополнительной информацией по данным значениям, задаваемым по умолчанию, см. Руководство по XML Schema.

Автор: Msdn Online