Опубликован: 04.07.2012 | Уровень: специалист | Доступ: платный
Лекция 9:

Введение в XML. Структура XML документа. Объектная модель DOM 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 документа можно описать следующим образом:

Модель содержимого для XML документа.

увеличить изображение
Рис. 13.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>
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам

 

Елена Кашникова
Елена Кашникова
Россия, братск