Теория и практика разработки современных клиентских веб-приложений

Введение в XML. Структура XML документа

Разбить на страницы
Показывать лекцию целиком

Введение в XML

В 1986 году, задолго до того, как идея создания сети Веб была воплощена в жизнь, универсальный стандартизированный язык разметки SGML ( Standardized Generalized Markup Language ) был утвержден в качестве международного стандарта ( ISO 8879 ) определения языков разметки, хотя SGML существовал еще с конца шестидесятых. Он использовался для того, чтобы описывать языки разметки, предоставляя при этом автору возможность давать формальные определения каждому элементу и атрибуту языка.

Язык HTML первоначально был всего лишь одним из SGML -приложений. Он описывал правила, по которым должна быть подготовлена информация для World Wide Web. Таким образом, язык HTML - это набор предписаний SGML, сформулированных в виде определения типа документа ( DTD ), объясняющих, что именно обозначают тэги и элементы. Схема DTD для языка HTML хранится в веб-браузере.

К недостаткам языка HTML можно отнести следующие:

  • HTML имеет фиксированный набор тэгов. Нельзя создавать свои тэги, понятные другим пользователям.
  • HTML - это исключительно технология представления данных. HTML не несет информации о значении содержания, заключенного в тэгах.
  • HTML - "плоский" язык. Значимость тэгов в нем не определена, поэтому с его помощью нельзя описать иерархию данных.
  • В качестве платформы для приложений используются браузеры. HTML не обладает достаточной мощью для создания веб-приложений на том уровне, к которому в настоящее время стремятся веб-разработчики. Например, на языке HTML невозможно разработать приложение для профессиональной обработки и поиска документов.
  • Большие объемы трафика сети. Существующие HTML -документы, используемые как приложения, перегружают Интернет большими объемами трафика в системах клиент-сервер. Примером может служить пересылка по сети большого по объему документа, в то время как необходима только небольшая часть этого документа.
  • Таким образом, с одной стороны, язык HTML является очень удобным средством разметки документов для использования в веб, а с другой - документ, размеченный в HTML, имеет мало информации о своем содержании. Если тот или иной документ несет достаточно полную информацию о своем содержании, появляется возможность сравнительно легко провести автоматическую обобщенную обработку и поиск в файле, хранящем документ. Язык SGML позволяет сохранять информацию о содержании документа, однако вследствие особой сложности он никогда не использовался так широко, как HTML.

    Группа экспертов по языку SGML, возглавляемая Джоном Боузэком ( Jon Bosak ) из компании Sun Microsystems, приступила к работе по созданию подмножества языка SGML, которое могло бы быть принято Web -сообществом. Решено было удалить многие несущественные возможности SGML. Перестроенный таким образом язык назвали XML. Упрощенный вариант оказался значительно более доступным, чем оригинал, его спецификации занимали всего 26 страниц по сравнению с более чем 500 страницами спецификаций SGML.

    Рассмотрим более детально структуру и особенности этого языка.

    XML (eXtensible Markup Language) - рекомендованный W3C язык разметки. XML - текстовый формат, предназначенный для хранения структурированных данных, для обмена информацией между программами, а также для создания на его основе специализированных языков разметки. XML является упрощённым подмножеством языка SGML.

    Язык XML имеет следующие достоинства:

  • Это человеко-ориентированный формат документа, он понятен как человеку, так и компьютеру.
  • Поддерживает Юникод.
  • В формате XML могут быть описаны основные структуры данных - такие как записи, списки и деревья.
  • Это самодокументируемый формат, который описывает структуру и имена полей также как и значения полей.
  • Имеет строго определённый синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым.
  • Широко используется для хранения и обработки документов;
  • Это формат, основанный на международных стандартах;
  • Иерархическая структура XML подходит для описания практически любых типов документов;
  • Представляет собой простой текст, свободный от лицензирования и каких-либо ограничений;
  • Не зависит от платформы;
  • Является подмножеством SGML, для которого накоплен большой опыт работы и созданы специализированные приложения;
  • К известным недостаткам языка можно отнести следующие:

  • Синтаксис XML избыточен.
  • Размер XML документа существенно больше бинарного представления тех же данных (порядка 10 раз).
  • Размер XML документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML ) и особенно в форматах данных, оптимизированных для конкретного случая использования.
  • Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.
  • Для большого количества задач не нужна вся мощь синтаксиса XML, и можно использовать значительно более простые и производительные решения.
  • Пространства имён XML сложно использовать и их сложно реализовывать в XML парсерах.
  • XML не содержит встроенной в язык поддержки типов данных. В нём нет понятий "целых чисел", "строк", "дат", "булевых значений" и т. д.
  • Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами.
  • Вообще говоря, XML можно рассматривать не только как новый язык разметки, но и как основу для целого семейства технологий:

    Структура семейства XML
    XML Технические рекомендации об использовании XML
    DTD Определение типа документа (схема)
    XDR Формат XML Reduced (схема Microsoft )
    XSD Определение схемы XML (схемы W3C )
    Пространство имен Метод определения имен элементов и атрибутов
    XPath Язык путей XML
    XLink Язык ссылок XML
    XPointer Язык указателей XML
    DOM API для объектной модели документа
    SAX Простой API для XML
    XSL Расширяемый язык таблиц стилей
    XSL-FO Объекты форматирования XSL
    XSLT Язык преобразований XSL
    XInclude Синтаксис XML Include
    XBase Синтаксис XML Base URI

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

    (рис 9.1) Взаимосвязь между SGML, XML и HTML

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

    Документ XML считается правильно построенным, если он соответствует всем синтаксическим правилам XML.

    Проверка действительности документа предполагает выполнение следующих действий:

  • Проверка использования только заданного набора дескрипторов.
  • Проверка полного соответствия порядка следования элементов и атрибутов содержанию документа или определенным правилам.
  • Контроль типов данных (достигается при использовании соответствующей схемы).
  • Контроль целостности данных для обеспечения оптимального обмена информацией через Веб с помощью транзакций.
  • Рассмотрим теперь основные синтаксические правила построения XML документов.

  • XML документ содержит один и только один корневой элемент, содержащий все остальные элементы
  • Дочерние элементы, содержащиеся в корневом элементе, должны быть правильно вложены.
  • Имена элементов подчиняются правилам:
  • Имя начинается с буквы, знака подчеркивания или двоеточия.
  • После первого символа в имени могут быть буквы, цифры, знаки переноса, подчеркивания, точка или двоеточие.
  • Имена не могут начинаться с буквосочетания XML.
  • XML документ имеет следующую структуру :

  • Первая строка XML документа называется объявлением XML. Это необязательная строка, указывающая версию стандарта XML (обычно это 1.0). Также здесь может быть указана кодировка символов и внешние зависимости.
  • Комментарий может быть размещен в любом месте дерева. XML комментарии размещаются внутри пары тегов <!-- и заканчиваются -->. Два знака дефис (--) не могут быть применены ни в какой части внутри комментария.
  • Остальная часть этого XML -документа состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержимое.
  • Элемент обычно состоит из открывающего и закрывающего тегов, обрамляющих текст и другие элементы.
  • Открывающий тег состоит из имени элемента в угловых скобках;
  • Закрывающий тег состоит из того же имени в угловых скобках, но перед именем ещё добавляется косая черта.
  • Содержимым элемента называется всё, что расположено между открывающим и закрывающим тегами, включая текст и другие (вложенные) элементы.
  • Кроме содержания у элемента могут быть атрибуты - пары имя=значение, добавляемые внутрь открывающего тега после названия элемента.
  • Значения атрибутов всегда заключаются в кавычки (одинарные или двойные), одно и то же имя атрибута не может встречаться дважды в одном элементе.
  • Не рекомендуется использовать разные типы кавычек для значений атрибутов одного тега.
  • Для обозначения элемента без содержания, называемого пустым элементом, необходимо применять особую форму записи, состоящую из одного тега, в котором после имени элемента ставится косая черта "/".
  • К сожалению, описанные выше правила позволяют контролировать только формальную правильность XML документа, но не содержательную. Для решения второй задачи используются так называемые схемы.

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

    Чаще всего для описания схемы используются следующие спецификации:

  • DTD (Document Type Definition) - язык определения типа документов.
  • XDR (XML Data Reduced) - диалект XML, разработанный Microsoft.
  • XSD (язык определения схем XML) - рекомендована консорциумом W3C.
  • XML документ отличается от HTML документа также и тем, как он отображается в веб-браузере. Без использования CSS или XSL XML -документ отображается как простой текст в большинстве веб-браузеров. Некоторые веб-браузеры, такие как Internet Explorer и Mozilla Firefox отображают структуру документа в виде дерева, позволяя сворачивать и разворачивать узлы с помощью нажатий клавиши мыши.

    Наиболее распространены три способа преобразования XML -документа в отображаемый пользователю вид:

  • Применение стилей CSS.
  • Применение преобразования XSLT.
  • Написание на каком-либо языке программирования обработчика XML -документа.
  • Языки описания cхем XML

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

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

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

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

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

    (рис 9.2) Модель содержимого для 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 -Data Reduced - это "часть" полной рекомендации. Схема 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 Schema

    Так же как DTD схема XML Schema определяет допустимые строительные блоки XML документа.

    XML Schema:

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

  • Расширяема для будущих добавлений.
  • Более богатые и мощные выразительные возможности.
  • Является реализацией XML.
  • Поддерживает типы данных.
  • Поддерживают пространства имен.
  • XML Schema стала W3C рекомендацией в 2001 году.

    Рассмотрим в качестве примера XML документ:

    <?xml version="1.0" encoding="Windows-1251"?>
    <mail>
    <to>user1@domain.ru</to>
    <from>user2@domain.ru </from>
    <subject>Встреча</subject>
    <body>Позвони мне завтра утром</body>
    </mail>

    Структура данного документа может быть рассмотрена с помощью следующей XML Schema:

    <?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myhp.edu"
    xmlns=" http://www.myhp.edu"
    elementFormDefault="qualified">
    <xs:element name="mail">
        <xs:complexType>
          <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="subject" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
    </xs:element>
    </xs:schema>

    В данном примере элемент mail имеет тип complexType, поскольку содержит другие элементы. Другие элементы документа имеют простой тип, поскольку не включают других элементов.

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

    <?xml version="1.0"?>
    <mail 
    xmlns="http:// www.myhp.edu "
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.myhp.edu mail.xsd">
    <to>user1@domain.ru</to>
    <from>user2@domain.ru </from>
    <subject>Встреча</heading>
    <body>Позвони мне завтра утром</body>
    </mail>

    Элемент <schema> является корневым элементом любой схемы XML Schema.

    Данный элемент может содержать несколько атрибутов, например:

    <?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myhp.edu"
    xmlns="http://www.myhp.edu"
    elementFormDefault="qualified">
    ...
    ...
    </xs:schema>

    Следующий фрагмент:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"

    Указывает на то, что элементы и типы данных, используемые в схеме входят в пространство http://www.w3.org/2001/XMLSchema. Причем, все элементы и типы данных из этого пространства имен должны иметь префикс xs.

    Фрагмент:

    targetNamespace="http://www.myhp.edu"

    указывает на то, что элементы, определяемые в схеме входят в пространство "http://www.myhp.edu".

    Во фрагменте:

    xmlns="http://www.myhp.edu"

    указывается, что пространством имен по умолчанию является "http://www.myhp.edu"

    Следующий фрагмент:

    elementFormDefault="qualified"

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

    Ссылка на внешнюю схему может выглядеть следующим образом:

    <?xml version="1.0"?>
    <mail xmlns=" http://www.myhp.edu "
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=" http://www.myhp.edu mail.xsd">
    <to>user1@domain.ru</to>
    <from>user2@domain.ru </from>
    <subject>Встреча</heading>
    <body>Позвони мне завтра утром</body>
    </mail>

    Здесь строка

    xsi:schemaLocation=" http://www.myhp.edu mail.xsd">

    указывает на местоположение файла схемы.

    Определение простых элементов

    Синтаксис для определения простого элемента:

    <xs:element name="xxx" type="yyy"/>

    где xxx - имя элемента и yyy тип данных элемента. Встроенными типами данных элементов являются следующие:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time
  • Например, фрагмент XML документа:

    <lastname>Refsnes</lastname>
    <age>36</age>
    <dateborn>1970-03-27</dateborn>

    описывается в схеме следующим образом:

    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="age" type="xs:integer"/>
    <xs:element name="dateborn" type="xs:date"/>

    Следующие фрагменты:

    <xs:element name="color" type="xs:string" default="red"/>

    и

    <xs:element name="color" type="xs:string" fixed="red"/>

    описывают значение элемента по умолчанию и фиксированное значения соответственно.

    Все атрибуты описываются простыми типами данных.

    Простые элементы не могут иметь атрибутов. Если элемент имеет атрибуты, он рассматривается как имеющий сложный тип. Сам атрибут рассматривается всегда как имеющий простой тип.

    Описание атрибута обычно дается следующим образом:

    <xs:attribute name="xxx" type="yyy"/>

    где xxx - имя атрибута, а yyy - определяет тип данных атрибута.

    Встроенными типами данных для атрибутов являются следующие:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:time
  • Например, XML элемент с атрибутом:

    <lastname lang="EN">Smith</lastname>

    описывается соответствующей схемой:

    <xs:attribute name="lang" type="xs:string"/>

    Значение по умолчанию и фиксированное значение атрибута описываются следующим образом:

    <xs:attribute name="lang" type="xs:string" default="EN"/>

    и

    <xs:attribute name="lang" type="xs:string" fixed="EN"/>

    соответственно.

    Для описания обязательных атрибутов (по умолчанию все атрибуты являются необязательными) используется следующая нотация:

    <xs:attribute name="lang" type="xs:string" use="required"/>

    Ограничения на содержимое

    Для задания допустимых значений величин XML элементов и атрибутов можно использовать ограничения. Ограничения на значения XML элементов называются фасетами.

    Список возможных ограничений приводится ниже:

    Ограничение Описание
    enumeration Определяет список допустимых значений
    fractionDigits Указывет максимальное число десятичных позиций. Должно быть неотрицательным
    length Указывает точное число символов или элементов в списке. Должно быть неотрицательным
    maxExclusive Указывает верхнюю границу числовых значений
    maxInclusive Указывает верхнюю границу числовых значений
    maxLength Указывает максимальное число символов или элементов в списке. Должно быть неотрицательным
    minExclusive Указывает нижнюю невключаемую границу числовых значений
    minInclusive Указывает нижнюю включаемую границу числовых значений
    minLength Указывает минимальное число символов или элементов в списке. Должно быть неотрицательным
    pattern Определяет точно последовательность символов (шаблон), которая допустима
    totalDigits Определяет точное число цифр. Должно быть неотрицательным
    whiteSpace Указывает как обрабатывать неотображаемые символы (пробел, табуляция и др.)

    Примеры ограничения:

    <xs:element name="age">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="0"/>
        <xs:maxInclusive value="120"/>
      </xs:restriction>
    </xs:simpleType>
    </xs:element>
    
    <xs:element name="password">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[a-zA-Z0-9]{8}"/>
      </xs:restriction>
    </xs:simpleType>
    </xs:element>

    Описание сложных элементов

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

    Рассмотрим следующий пример:

    <employee>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    </employee>

    Сложный элемент в схеме можно определить следующим образом:

    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    
    <xs:element name="employee">
     <xs:complexType>
      <xs:sequence>
       <xs:element ref="firstname"/>
       <xs:element ref="lastname"/>
      </xs:sequence>
     </xs:complexType>
    </xs:element>

    Другой подход заключается в повторном использовании именованных элементов.

  • Элемент "employee" element может быть объявлен непосредственно по имени:

    <xs:element name="employee">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    Поскольку дочерние элементы "firstname" и "lastname" окружены индикатором <sequence>, то они должны в документе появляться именно в этой последовательности.

  • Элемент "employee" может иметь атрибут типа, ссылающийся на имя сложного типа:

    <xs:element name="employee" type="personinfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  • Несколько элементов могут ссылаться на тот же самый сложный тип:

    <xs:element name="employee" type="personinfo"/>
    <xs:element name="student" type="personinfo"/>
    <xs:element name="member" type="personinfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>

    Также можно строить сложный элемент на базе существующего сложного элемента с добавлением нескольких элементов:

    <xs:element name="employee" type="fullpersoninfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="fullpersoninfo">
      <xs:complexContent>
        <xs:extension base="personinfo">
          <xs:sequence>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>

    Пустой сложный элемент не может иметь содержимого, только атрибуты.

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

    Всего используется семь индикаторов:

  • Индикатор порядка ( Order ):
  • All
  • Choice
  • Sequence
  • Индикатор вхождения ( Occurrence ):
  • maxOccurs
  • minOccurs
  • Групповые ( Group ) индикаторы:
  • Group name
  • attributeGroup name
  • Пример:

    <xs:element name="person">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="full_name" type="xs:string"/>
          <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    Валидаторы XML

    Для проверки действительности ).

    Для проверки схем также существуют специальные валидаторы, например ).

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

    Страницы:

    Введение в XML

    В 1986 году, задолго до того, как идея создания сети Веб была воплощена в жизнь, универсальный стандартизированный язык разметки SGML ( Standardized Generalized Markup Language ) был утвержден в качестве международного стандарта ( ISO 8879 ) определения языков разметки, хотя SGML существовал еще с конца шестидесятых. Он использовался для того, чтобы описывать языки разметки, предоставляя при этом автору возможность давать формальные определения каждому элементу и атрибуту языка.

    Язык HTML первоначально был всего лишь одним из SGML -приложений. Он описывал правила, по которым должна быть подготовлена информация для World Wide Web. Таким образом, язык HTML - это набор предписаний SGML, сформулированных в виде определения типа документа ( DTD ), объясняющих, что именно обозначают тэги и элементы. Схема DTD для языка HTML хранится в веб-браузере.

    К недостаткам языка HTML можно отнести следующие:

  • HTML имеет фиксированный набор тэгов. Нельзя создавать свои тэги, понятные другим пользователям.
  • HTML - это исключительно технология представления данных. HTML не несет информации о значении содержания, заключенного в тэгах.
  • HTML - "плоский" язык. Значимость тэгов в нем не определена, поэтому с его помощью нельзя описать иерархию данных.
  • В качестве платформы для приложений используются браузеры. HTML не обладает достаточной мощью для создания веб-приложений на том уровне, к которому в настоящее время стремятся веб-разработчики. Например, на языке HTML невозможно разработать приложение для профессиональной обработки и поиска документов.
  • Большие объемы трафика сети. Существующие HTML -документы, используемые как приложения, перегружают Интернет большими объемами трафика в системах клиент-сервер. Примером может служить пересылка по сети большого по объему документа, в то время как необходима только небольшая часть этого документа.
  • Таким образом, с одной стороны, язык HTML является очень удобным средством разметки документов для использования в веб, а с другой - документ, размеченный в HTML, имеет мало информации о своем содержании. Если тот или иной документ несет достаточно полную информацию о своем содержании, появляется возможность сравнительно легко провести автоматическую обобщенную обработку и поиск в файле, хранящем документ. Язык SGML позволяет сохранять информацию о содержании документа, однако вследствие особой сложности он никогда не использовался так широко, как HTML.

    Группа экспертов по языку SGML, возглавляемая Джоном Боузэком ( Jon Bosak ) из компании Sun Microsystems, приступила к работе по созданию подмножества языка SGML, которое могло бы быть принято Web -сообществом. Решено было удалить многие несущественные возможности SGML. Перестроенный таким образом язык назвали XML. Упрощенный вариант оказался значительно более доступным, чем оригинал, его спецификации занимали всего 26 страниц по сравнению с более чем 500 страницами спецификаций SGML.

    Рассмотрим более детально структуру и особенности этого языка.

    XML (eXtensible Markup Language) - рекомендованный W3C язык разметки. XML - текстовый формат, предназначенный для хранения структурированных данных, для обмена информацией между программами, а также для создания на его основе специализированных языков разметки. XML является упрощённым подмножеством языка SGML.

    Язык XML имеет следующие достоинства:

  • Это человеко-ориентированный формат документа, он понятен как человеку, так и компьютеру.
  • Поддерживает Юникод.
  • В формате XML могут быть описаны основные структуры данных - такие как записи, списки и деревья.
  • Это самодокументируемый формат, который описывает структуру и имена полей также как и значения полей.
  • Имеет строго определённый синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым.
  • Широко используется для хранения и обработки документов;
  • Это формат, основанный на международных стандартах;
  • Иерархическая структура XML подходит для описания практически любых типов документов;
  • Представляет собой простой текст, свободный от лицензирования и каких-либо ограничений;
  • Не зависит от платформы;
  • Является подмножеством SGML, для которого накоплен большой опыт работы и созданы специализированные приложения;
  • К известным недостаткам языка можно отнести следующие:

  • Синтаксис XML избыточен.
  • Размер XML документа существенно больше бинарного представления тех же данных (порядка 10 раз).
  • Размер XML документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML ) и особенно в форматах данных, оптимизированных для конкретного случая использования.
  • Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.
  • Для большого количества задач не нужна вся мощь синтаксиса XML, и можно использовать значительно более простые и производительные решения.
  • Пространства имён XML сложно использовать и их сложно реализовывать в XML парсерах.
  • XML не содержит встроенной в язык поддержки типов данных. В нём нет понятий "целых чисел", "строк", "дат", "булевых значений" и т. д.
  • Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами.
  • Вообще говоря, XML можно рассматривать не только как новый язык разметки, но и как основу для целого семейства технологий:

    Структура семейства XML
    XML Технические рекомендации об использовании XML
    DTD Определение типа документа (схема)
    XDR Формат XML Reduced (схема Microsoft )
    XSD Определение схемы XML (схемы W3C )
    Пространство имен Метод определения имен элементов и атрибутов
    XPath Язык путей XML
    XLink Язык ссылок XML
    XPointer Язык указателей XML
    DOM API для объектной модели документа
    SAX Простой API для XML
    XSL Расширяемый язык таблиц стилей
    XSL-FO Объекты форматирования XSL
    XSLT Язык преобразований XSL
    XInclude Синтаксис XML Include
    XBase Синтаксис XML Base URI

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

    (рис 9.1) Взаимосвязь между SGML, XML и HTML

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

    Документ XML считается правильно построенным, если он соответствует всем синтаксическим правилам XML.

    Проверка действительности документа предполагает выполнение следующих действий:

  • Проверка использования только заданного набора дескрипторов.
  • Проверка полного соответствия порядка следования элементов и атрибутов содержанию документа или определенным правилам.
  • Контроль типов данных (достигается при использовании соответствующей схемы).
  • Контроль целостности данных для обеспечения оптимального обмена информацией через Веб с помощью транзакций.
  • Рассмотрим теперь основные синтаксические правила построения XML документов.

  • XML документ содержит один и только один корневой элемент, содержащий все остальные элементы
  • Дочерние элементы, содержащиеся в корневом элементе, должны быть правильно вложены.
  • Имена элементов подчиняются правилам:
  • Имя начинается с буквы, знака подчеркивания или двоеточия.
  • После первого символа в имени могут быть буквы, цифры, знаки переноса, подчеркивания, точка или двоеточие.
  • Имена не могут начинаться с буквосочетания XML.
  • XML документ имеет следующую структуру :

  • Первая строка XML документа называется объявлением XML. Это необязательная строка, указывающая версию стандарта XML (обычно это 1.0). Также здесь может быть указана кодировка символов и внешние зависимости.
  • Комментарий может быть размещен в любом месте дерева. XML комментарии размещаются внутри пары тегов <!-- и заканчиваются -->. Два знака дефис (--) не могут быть применены ни в какой части внутри комментария.
  • Остальная часть этого XML -документа состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержимое.
  • Элемент обычно состоит из открывающего и закрывающего тегов, обрамляющих текст и другие элементы.
  • Открывающий тег состоит из имени элемента в угловых скобках;
  • Закрывающий тег состоит из того же имени в угловых скобках, но перед именем ещё добавляется косая черта.
  • Содержимым элемента называется всё, что расположено между открывающим и закрывающим тегами, включая текст и другие (вложенные) элементы.
  • Кроме содержания у элемента могут быть атрибуты - пары имя=значение, добавляемые внутрь открывающего тега после названия элемента.
  • Значения атрибутов всегда заключаются в кавычки (одинарные или двойные), одно и то же имя атрибута не может встречаться дважды в одном элементе.
  • Не рекомендуется использовать разные типы кавычек для значений атрибутов одного тега.
  • Для обозначения элемента без содержания, называемого пустым элементом, необходимо применять особую форму записи, состоящую из одного тега, в котором после имени элемента ставится косая черта "/".
  • К сожалению, описанные выше правила позволяют контролировать только формальную правильность XML документа, но не содержательную. Для решения второй задачи используются так называемые схемы.

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

    Чаще всего для описания схемы используются следующие спецификации:

  • DTD (Document Type Definition) - язык определения типа документов.
  • XDR (XML Data Reduced) - диалект XML, разработанный Microsoft.
  • XSD (язык определения схем XML) - рекомендована консорциумом W3C.
  • XML документ отличается от HTML документа также и тем, как он отображается в веб-браузере. Без использования CSS или XSL XML -документ отображается как простой текст в большинстве веб-браузеров. Некоторые веб-браузеры, такие как Internet Explorer и Mozilla Firefox отображают структуру документа в виде дерева, позволяя сворачивать и разворачивать узлы с помощью нажатий клавиши мыши.

    Наиболее распространены три способа преобразования XML -документа в отображаемый пользователю вид:

  • Применение стилей CSS.
  • Применение преобразования XSLT.
  • Написание на каком-либо языке программирования обработчика XML -документа.
  • Языки описания cхем XML

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

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

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

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

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

    (рис 9.2) Модель содержимого для 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 -Data Reduced - это "часть" полной рекомендации. Схема 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 Schema

    Так же как DTD схема XML Schema определяет допустимые строительные блоки XML документа.

    XML Schema:

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

  • Расширяема для будущих добавлений.
  • Более богатые и мощные выразительные возможности.
  • Является реализацией XML.
  • Поддерживает типы данных.
  • Поддерживают пространства имен.
  • XML Schema стала W3C рекомендацией в 2001 году.

    Рассмотрим в качестве примера XML документ:

    <?xml version="1.0" encoding="Windows-1251"?>
    <mail>
    <to>user1@domain.ru</to>
    <from>user2@domain.ru </from>
    <subject>Встреча</subject>
    <body>Позвони мне завтра утром</body>
    </mail>

    Структура данного документа может быть рассмотрена с помощью следующей XML Schema:

    <?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myhp.edu"
    xmlns=" http://www.myhp.edu"
    elementFormDefault="qualified">
    <xs:element name="mail">
        <xs:complexType>
          <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="subject" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
    </xs:element>
    </xs:schema>

    В данном примере элемент mail имеет тип complexType, поскольку содержит другие элементы. Другие элементы документа имеют простой тип, поскольку не включают других элементов.

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

    <?xml version="1.0"?>
    <mail 
    xmlns="http:// www.myhp.edu "
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.myhp.edu mail.xsd">
    <to>user1@domain.ru</to>
    <from>user2@domain.ru </from>
    <subject>Встреча</heading>
    <body>Позвони мне завтра утром</body>
    </mail>

    Элемент <schema> является корневым элементом любой схемы XML Schema.

    Данный элемент может содержать несколько атрибутов, например:

    <?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.myhp.edu"
    xmlns="http://www.myhp.edu"
    elementFormDefault="qualified">
    ...
    ...
    </xs:schema>

    Следующий фрагмент:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"

    Указывает на то, что элементы и типы данных, используемые в схеме входят в пространство http://www.w3.org/2001/XMLSchema. Причем, все элементы и типы данных из этого пространства имен должны иметь префикс xs.

    Фрагмент:

    targetNamespace="http://www.myhp.edu"

    указывает на то, что элементы, определяемые в схеме входят в пространство "http://www.myhp.edu".

    Во фрагменте:

    xmlns="http://www.myhp.edu"

    указывается, что пространством имен по умолчанию является "http://www.myhp.edu"

    Следующий фрагмент:

    elementFormDefault="qualified"

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

    Ссылка на внешнюю схему может выглядеть следующим образом:

    <?xml version="1.0"?>
    <mail xmlns=" http://www.myhp.edu "
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=" http://www.myhp.edu mail.xsd">
    <to>user1@domain.ru</to>
    <from>user2@domain.ru </from>
    <subject>Встреча</heading>
    <body>Позвони мне завтра утром</body>
    </mail>

    Здесь строка

    xsi:schemaLocation=" http://www.myhp.edu mail.xsd">

    указывает на местоположение файла схемы.

    Определение простых элементов

    Синтаксис для определения простого элемента:

    <xs:element name="xxx" type="yyy"/>

    где xxx - имя элемента и yyy тип данных элемента. Встроенными типами данных элементов являются следующие:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time
  • Например, фрагмент XML документа:

    <lastname>Refsnes</lastname>
    <age>36</age>
    <dateborn>1970-03-27</dateborn>

    описывается в схеме следующим образом:

    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="age" type="xs:integer"/>
    <xs:element name="dateborn" type="xs:date"/>

    Следующие фрагменты:

    <xs:element name="color" type="xs:string" default="red"/>

    и

    <xs:element name="color" type="xs:string" fixed="red"/>

    описывают значение элемента по умолчанию и фиксированное значения соответственно.

    Все атрибуты описываются простыми типами данных.

    Простые элементы не могут иметь атрибутов. Если элемент имеет атрибуты, он рассматривается как имеющий сложный тип. Сам атрибут рассматривается всегда как имеющий простой тип.

    Описание атрибута обычно дается следующим образом:

    <xs:attribute name="xxx" type="yyy"/>

    где xxx - имя атрибута, а yyy - определяет тип данных атрибута.

    Встроенными типами данных для атрибутов являются следующие:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:time
  • Например, XML элемент с атрибутом:

    <lastname lang="EN">Smith</lastname>

    описывается соответствующей схемой:

    <xs:attribute name="lang" type="xs:string"/>

    Значение по умолчанию и фиксированное значение атрибута описываются следующим образом:

    <xs:attribute name="lang" type="xs:string" default="EN"/>

    и

    <xs:attribute name="lang" type="xs:string" fixed="EN"/>

    соответственно.

    Для описания обязательных атрибутов (по умолчанию все атрибуты являются необязательными) используется следующая нотация:

    <xs:attribute name="lang" type="xs:string" use="required"/>

    Ограничения на содержимое

    Для задания допустимых значений величин XML элементов и атрибутов можно использовать ограничения. Ограничения на значения XML элементов называются фасетами.

    Список возможных ограничений приводится ниже:

    Ограничение Описание
    enumeration Определяет список допустимых значений
    fractionDigits Указывет максимальное число десятичных позиций. Должно быть неотрицательным
    length Указывает точное число символов или элементов в списке. Должно быть неотрицательным
    maxExclusive Указывает верхнюю границу числовых значений
    maxInclusive Указывает верхнюю границу числовых значений
    maxLength Указывает максимальное число символов или элементов в списке. Должно быть неотрицательным
    minExclusive Указывает нижнюю невключаемую границу числовых значений
    minInclusive Указывает нижнюю включаемую границу числовых значений
    minLength Указывает минимальное число символов или элементов в списке. Должно быть неотрицательным
    pattern Определяет точно последовательность символов (шаблон), которая допустима
    totalDigits Определяет точное число цифр. Должно быть неотрицательным
    whiteSpace Указывает как обрабатывать неотображаемые символы (пробел, табуляция и др.)

    Примеры ограничения:

    <xs:element name="age">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="0"/>
        <xs:maxInclusive value="120"/>
      </xs:restriction>
    </xs:simpleType>
    </xs:element>
    
    <xs:element name="password">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[a-zA-Z0-9]{8}"/>
      </xs:restriction>
    </xs:simpleType>
    </xs:element>

    Описание сложных элементов

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

    Рассмотрим следующий пример:

    <employee>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    </employee>

    Сложный элемент в схеме можно определить следующим образом:

    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    
    <xs:element name="employee">
     <xs:complexType>
      <xs:sequence>
       <xs:element ref="firstname"/>
       <xs:element ref="lastname"/>
      </xs:sequence>
     </xs:complexType>
    </xs:element>

    Другой подход заключается в повторном использовании именованных элементов.

  • Элемент "employee" element может быть объявлен непосредственно по имени:

    <xs:element name="employee">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    Поскольку дочерние элементы "firstname" и "lastname" окружены индикатором <sequence>, то они должны в документе появляться именно в этой последовательности.

  • Элемент "employee" может иметь атрибут типа, ссылающийся на имя сложного типа:

    <xs:element name="employee" type="personinfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  • Несколько элементов могут ссылаться на тот же самый сложный тип:

    <xs:element name="employee" type="personinfo"/>
    <xs:element name="student" type="personinfo"/>
    <xs:element name="member" type="personinfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>

    Также можно строить сложный элемент на базе существующего сложного элемента с добавлением нескольких элементов:

    <xs:element name="employee" type="fullpersoninfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="fullpersoninfo">
      <xs:complexContent>
        <xs:extension base="personinfo">
          <xs:sequence>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>

    Пустой сложный элемент не может иметь содержимого, только атрибуты.

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

    Всего используется семь индикаторов:

  • Индикатор порядка ( Order ):
  • All
  • Choice
  • Sequence
  • Индикатор вхождения ( Occurrence ):
  • maxOccurs
  • minOccurs
  • Групповые ( Group ) индикаторы:
  • Group name
  • attributeGroup name
  • Пример:

    <xs:element name="person">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="full_name" type="xs:string"/>
          <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    Валидаторы XML

    Для проверки действительности ).

    Для проверки схем также существуют специальные валидаторы, например ).

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

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