Введение в Web-технологии

Языки описания cхем XML

Показывать лекцию целиком

Идея создания собственных тэгов, имеющих специальное значение и помогающих описать содержание документа, сама по себе просто замечательна. Но если каждый пользователь может создавать свои собственные описания, каким образом их распознавать? С этой целью в спецификации XML для описания подобных "самодеятельных" тэгов используются схемы. Они необходимы для того, чтобы:

  • описать, что именно является разметкой;
  • описать точно, что означает разметка.
  • Наиболее известными языками описания схем являются следующие:

  • DTD (Document Type Definition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.
  • XDR (XML Data Reduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в Internet Explorer 4 и 5 версий.
  • XML Schema или просто XSD ( язык определения схем XML) – рекомендация консорциума W3C с 2001 года.
  • Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в лабораторной работе 11.

    DTD схема

    Схема DTD предоставляет шаблон разметки документа, в котором указываются наличие, порядок следования и расположение элементов и их атрибутов в документе XML.

    В рамках DTD модель содержимого XML документа можно описать следующим образом:

    Каждый элемент документа может иметь один из типов:

    Содержание Синтаксис Комментарий
    Данные <!ELEMENT имя (#PCDATA)> Содержит только текстовые данные
    Другие элементы <!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)> Содержит только дочерние элементы
    Смешанное <!ELEMENT имя (#PCDATA, дочерний элемент)*> Содержит комбинацию текстовых данных и дочерних элементов
    EMPTY <!ELEMENT имя EMPTY> Ничего не содержит
    ANY <!ELEMENT имя ANY> Может содержать текстовые данные или дочерние элементы

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

    <!ATTList  
    имя_элемента   имя_атрибута1 (тип)   значение_по_умолчанию
    …………………………………………………………………………………... 
    имя_элемента   имя_атрибутаN (тип)   значение_по_умолчанию >

    При этом атрибут в DTD может иметь один из трех типов:

  • Строка
  • Маркированные атрибут
  • Атрибута с перечислением
  • Кроме типа атрибута можно также задавать и его модальность:

    Значение Описание
    #REQUIRED Атрибут обязательно должен быть указан
    #FIXED Значение атрибута не должно отличаться от указанного
    #IMPLIED Необязательное значение

    Рассмотрим в качестве примера описание атрибутов строкового типа для элемента, описывающего некоторое сообщение:

    <!ATTLIST message
    number	CDATA	#REQUIRED
    date		CDATA	#REQUIRED
    from		CDATA	#FIXED
    status		CDATA	#IMPLIED>

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

    <!ATTLIST message
    number	ID		#REQUIRED
    from		CDATA	#REQUIRED
    alert		(low | normal | urgent) "normal">

    Маркированных атрибуты элемента могут быть четырех типов:

    Значение Описание
    ID Уникальный идентификатор элемента (начинается с буквы, двоеточия или подчеркивания)
    IDREF Ссылка на элемент, содержащий атрибуты ID
    ENTITIES Ссылка на внешний элемент
    NMTOKEN Содержит буквы, цифры, точки, знаки подчеркивания, переносы, двоеточия, но не пробелы

    И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:

    Символ Пример Описание
    , (a, b, c) Последовательное использование элементов списка
    | (a | b | c) Используется один из членов списка
    date Используется один и только один элемент
    ? subject? Необязательное использование (0 или 1 раз)
    + paragraph+ Используется один или несколько раз
    * brother* Используется ноль или несколько раз

    В качестве примера приведем DTD схему, описывающую структуру электронного почтового ящика:

    <!ELEMENT mailbox (message*)>
    <!ELEMENT message (head, body)>
    <!ATTLIST message uid CDATA #REQUIRED>
    <!ELEMENT head ( from,to+, subject?, CC*, notify?) >
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT subject (#PCDATA)>
    <!ELEMENT CC (#PCDATA)>
    <!ELEMENT notify EMPTY>
    <!ELEMENT body (#PCDATA)>

    Исходный XML документ, удовлетворяющий данной схеме, может выглядеть, например, так:

    <?xml version="1.0" ?>
    <!DOCTYPE mailbox SYSTEM "mailbox.dtd">
    <mailbox>
        <message uid="1">
            <head>
                <from>user1@myhp.edu</from>
                <to>user2@myhp.edu</to>
                <subject>Re:</subject>
            </head>
            <body>
                What's up!
            </body>
        </message>
        <message uid="2">
            <head>
                <from>user3@myhp.edu</from>
                <to>user2@myhp.edu</to>
                <subject>Remind</subject>
                <CC> user1@myhp.edu </CC>	  
                <notify/>
            </head>
            <body>
                Remind me about meeting. 
            </body>
        </message>
    </mailbox>

    Обратите внимание на 2-ю строчку документа, в которой указывается внешняя ссылка на файл, содержащий DTD схему.

    В принципе, DTD допускает два способа использования в XML документе.

  • Объявление внутренней схемы:
    <!DOCTYPE корневой_элемент [
    <!ELEMENT корневой_элемент (модель содержания)>
    ]>
  • Объявление внешней схемы:
    <!DOCTYPE корневой_элемент SYSTEM "name.DTD">
  • В заключение укажем на следующие недостатки DTD схем:

  • Не являются экземплярами XML. Требуется изучение совершенно другого языка.
  • Не предоставляют контроль за типами данных, за исключением самых простых текстовых данных.
  • Не являются экземплярами XML, поэтому их нельзя легко расширить или преобразовать к другим языкам разметки – HTML или DHTML.
  • Не обеспечивают поддержки пространств имен XML.
  • XDR схема

    XML-Data – полное имя языка описания схем, предложенного Майкрософт, а XML-DataReduced – это "часть" полной рекомендации. Схема XDR - это экземпляр XML, т.е. соответствует всем синтаксическим правилам и стандартам XML.

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

    Корневым элементом в схеме XDR всегда является элемент Schema:

    <Schema
        name="имя_схемы" xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
        <-- Объявления других элементов -->
    </Schema>

    Элемент ElementType имеет синтаксис:

    <ElementType 
        content="{empty | texOnly | eltOnly | mixed}">
        dt:type "datatype"
        model="{open | closed}"
        name = "idref"
        order="{one | seq | many}"
    >

    Элемент ElementType может иметь следующие атрибуты:

    Имя атрибута Описание
    name Имя элемента
    content Содержание элемента. Допустимые значения: empty (пустой элемент), eltOnly (может быть только контейнером для других элементов), textOnly (только текстовые данные), mixed (смешанные данные).
    dt:type Тип данных элемента
    model Может принимать значения:
    Open – разрешено использовать элементы, не определенные в схеме
    Closed – запрещено использовать элементы, не определенные в схеме
    order Порядок следования дочерних элементов в экземпляре XML. Допустимые значения:
    one – предполагается наличие одного документа
    many – любое количество элементов в любом порядке
    seq – элементы указываются в строго заданном порядке.

    В качестве дочерних элементов для ElementType можно использовать следующие:

    Имя элемента Описание
    element Объявляет дочерний элемент
    description Обеспечивает описание элемента ElementType
    datatype Обеспечивает тип данных элемента ElementType
    group Определяет порядок следования элементов
    AttributeType Определяет атрибут
    attribute Определяет сведения о дочернем элементе AttributeType

    Для объявления атрибутов используется синтаксис:

    <AttributeType 
            default="default-value"
            dt:type="primitive-type"
            dt:values="enumerated-values"
            name="idref"
            required="{yes|no}"
    >

    В свою очередь элемент AttributeType может иметь атрибуты:

    Значение Описание
    default Значение по умолчанию
    dt:type Один из следующих типов:
    entity, entities, enumeration, id, idref, nmtoken, nmtokens, notation, string
    dt:values Допустимые значения
    name Имя атрибута
    required Указывает на обязательное наличие атрибута в описании

    Синтаксис для описания элемента attribute выглядит следующим образом:

    <attribute
            default="default-value"
            type="attribute-type"
            [required="{yes|no}"]
    >

    а его возможные значения могут быть такими:

    Значение Комментарий
    default Значение по умолчанию
    type Имя элемента AttributeType, определенного в данной схеме. Должно соответствовать атрибуту name элемента AttributeType
    required Указывает на обязательное наличие атрибута в описании

    В отличие от DTD схем XDR поддерживает типы данных. Элемент Schema имеет следующий атрибут:

    Xmlns:dt="urn=schemas-microsoft-com:datatypes"

    С полным списком типов данных можно ознакомится на странице по адресу: http://msdn.microsoft.com/en-us/library/ms256121(VS.85).aspx

    Индикаторы вхождения в схемах XDR имеют синтаксис:

    <element
            type="element-type"
            [minOccur="{0|1}"]
            [maxOccur="{1|*}"]
    >

    XDR схема позволяет определять группы содержания. Так, в элементе ElementType может содержаться элемент group, имеющий синтаксис:

    <group order="(one|seq|many)" minOccur="(0|1)" 	maxOccur="(1|*)">
        <element type="ElementType/">
        <element type="ElementType/"> 
        <element type="ElementType/"> 
        <element type="ElementType/"> 
    </group>

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

    <?xml version = "1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">
    
        <xsd:element name="m_box">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element ref="message" minOccurs="0" 
                            maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    
        <xsd:element name="message">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element ref="head" minOccurs="1" maxOccurs="1"/>
                    <xsd:element ref="body" minOccurs="1" maxOccurs="1"/>
                </xsd:sequence>
                <xsd:attribute name="uid" use="required" type="xsd:string"/>
            </xsd:complexType>
        </xsd:element>
    
        <xsd:element name="head">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element ref="to" minOccurs="1" maxOccurs="unbounded"/>
                    <xsd:element ref="from" minOccurs="1" maxOccurs="1"/>
                    <xsd:element ref="date" minOccurs="1" maxOccurs="1"/>
                    <xsd:element ref="subject" minOccurs="1" maxOccurs="1"/>
                    <xsd:element ref="cc" minOccurs="0" maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    
        <xsd:element name="to" type="xsd:string"/>
        <xsd:element name="from" type="xsd:string"/>
        <xsd:element name="date" type="xsd:string"/>
        <xsd:element name="subject" type="xsd:string"/>
        <xsd:elememt name="cc" type="xsd:string"/>
    
    </xsd:schema>

    Для проверки действительности XML документа можно использовать специальные валидаторы, например W3C валидатор (http://validator.w3.org/).

    Для проверки схем также существуют специальные валидаторы, например XML Schema валидатор (http://www.w3.org/2001/03/webdata/xsv).

    Согласно спецификации W3C XML программа должна прекратить обработку XML документа, как только будет обнаружена ошибка в этом документе.

    Вернуться к учебному плану