SlideShare a Scribd company logo
1 of 29
Модуль 17 Основы XML
1
2
Определение содержимого документа
Document Type Definition или DTD (Определение
Типа Документа)
XML Schema
(схема XML)
3
Описание структуры XML-документа с
помощью DTD
4
Для чего используют DTD?
5
Внутренняя декларация DTD
6
Определение элементов
 Декларация элементов
<!ELEMENT имя-элемента категория>
<!ELEMENT имя-элемента (содержимое-элемента)>
 Элементы с потомками (последовательности)
<!ELEMENT имя-элемента (потомок1)>
 Элементы с анализируемыми символьными
данными
<!ELEMENT имя-элемента (#PCDATA)>
7
Определение элементов
Элементы с любым контентом
<!ELEMENT имя-элемента ANY>
Пустые элементы
<!ELEMENT имя-элемента EMPTY>
Декларация единичного элемента
<!ELEMENT имя-элемента (имя-потомка)>
8
Определение элементов
 Декларация минимум одного элемента
<!ELEMENT имя-элемента (имя-потомка+)>
 Декларирование от нуля и больше элементов <!
ELEMENT имя-элемента (имя-потомка*)>
 Декларирование от нуля до одного элемента
<!ELEMENT имя-элемента (имя-потомка?)>
9
Определение элементов
Декларирование альтернативных элементов
<!ELEMENT note (to,from,header,(message|body))>
Декларирование от нуля и больше элементов <!
ELEMENT имя-элемента (имя-потомка*)>
Декларирование от нуля до одного элемента
<!ELEMENT имя-элемента (имя-потомка?)>
10
Определение атрибутов элементов XML
DTD
Декларация атрибутов
<!ATTLIST имя-элемента имя-атрибута тип-атрибута
значение-атрибута>
Значение атрибута по умолчанию
<!ELEMENT square EMPTY> <!ATTLIST square width
CDATA "0">
>
11
Тип Описание
CDATA Значение — символьные данные
(en1|en2|..) Значение должно быть из перечисленного
списка
ID Значение — уникальный идентификатор
IDREF Значение — идентификатор другого элемента
IDREFS Значение — список других идентификаторов
NMTOKEN Значение — допустимое XML имя
NMTOKENS Значение — список допустимых XML имен
ENTITY Значение — сущность
ENTITIES Значение — список сущностей
NOTATION Значение — имя нотации
xml: Значение — предопределенное xml значение
12
Параметр "значение-атрибута" может принимать
следующие значение
Значение Описание
value Значение атрибута по умолчанию
#REQUIRED Атрибут обязателен
#IMPLIED Атрибут не обязателен
#FIXED value Атрибут имеет фиксированное значение
13
Определение атрибутов элементов XML
DTD
#REQUIRED
<!ATTLIST имя-элемента имя-атрибута тип-атрибута
#REQUIRED>
#IMPLIED
<!ATTLIST имя-элемента имя-атрибута тип-атрибута
#IMPLIED>
#FIXED
<!ATTLIST имя-элемента имя-атрибута тип-атрибута
#FIXED "значение">
14
Внешняя декларация DTD
15
Что дальше?
16
XML схемы
XSD – класс, XML – объект класса с различными
данными.
Описание на основе XML
Использование любых типов (string, int,
class)
Пространство имен
17
Почему XML схемы?
18
Подключение XML схем
19
Элемент schema
XML ссылается на схему XSD, на основе
которой он создан
Описовает для XML возможные элементы,
значения, ограничения, типы данных и д.р.
20
Подключение схемы в XML документе
21
Определение простых элементов
 Определение простого элемента
 Значения по умолчанию и фиксированные
значения
22
Определение атрибутов элементов XML
схемы
 Определение атрибута
 Значения по умолчанию и фиксированные
значения
 Обязательные и необязательные атрибуты
 Ограничения по контенту
23
24
Для чего нужны XML-парсеры и чем
они могут быть полезны
25
26
Программные интерфейсы XML
27
Simple API for XML
28
Как работает обработка в SAX
1. Начало документа
2. Начало элемента (samples)
3. Символы (пропуск)
4. Начало элемента (server)
5. Символы (UNIX)
6. Конец элемента (server)
7. Символы (пропуск)
8. Начало элемента (monitor)
9. Символы (color)
10. Конец элемента (monitor)
11. Символы (пропуск)
12. Конец элемента (samples)
29
Объектная Модель Документа
Document Object Model или DOM

More Related Content

More from Yevgeniy Gertsen

модуль 18 сериализация объектов
модуль 18 сериализация объектовмодуль 18 сериализация объектов
модуль 18 сериализация объектов
Yevgeniy Gertsen
 
модуль 17 основы xml
модуль 17 основы xmlмодуль 17 основы xml
модуль 17 основы xml
Yevgeniy Gertsen
 
модуль 16 взаимодействие с файловой системой
модуль 16 взаимодействие с файловой системоймодуль 16 взаимодействие с файловой системой
модуль 16 взаимодействие с файловой системой
Yevgeniy Gertsen
 
модуль 14 введение в generics
модуль 14 введение в genericsмодуль 14 введение в generics
модуль 14 введение в generics
Yevgeniy Gertsen
 
модуль 15 сборка мусора. рефлексия
модуль 15 сборка мусора. рефлексиямодуль 15 сборка мусора. рефлексия
модуль 15 сборка мусора. рефлексия
Yevgeniy Gertsen
 
модуль 13 использование коллекций
модуль 13 использование коллекциймодуль 13 использование коллекций
модуль 13 использование коллекций
Yevgeniy Gertsen
 
модуль 12 делегаты, события
модуль 12 делегаты, событиямодуль 12 делегаты, события
модуль 12 делегаты, события
Yevgeniy Gertsen
 
модуль 11 структуры, перечисления
модуль 11 структуры, перечислениямодуль 11 структуры, перечисления
модуль 11 структуры, перечисления
Yevgeniy Gertsen
 
Модуль 10 Интерфейсы
Модуль 10 ИнтерфейсыМодуль 10 Интерфейсы
Модуль 10 Интерфейсы
Yevgeniy Gertsen
 
Модуль 07 Перегрузка операторов
Модуль 07 Перегрузка операторовМодуль 07 Перегрузка операторов
Модуль 07 Перегрузка операторов
Yevgeniy Gertsen
 
модуль 06 пространства имен
модуль 06 пространства именмодуль 06 пространства имен
модуль 06 пространства имен
Yevgeniy Gertsen
 
модуль 05 обработка исключений
модуль 05 обработка исключениймодуль 05 обработка исключений
модуль 05 обработка исключений
Yevgeniy Gertsen
 
модуль 03 строки
модуль 03 строкимодуль 03 строки
модуль 03 строки
Yevgeniy Gertsen
 
модуль 03 массивы
модуль 03 массивымодуль 03 массивы
модуль 03 массивы
Yevgeniy Gertsen
 
модуль 02 основы языка программирования c#
модуль 02 основы языка программирования c#модуль 02 основы языка программирования c#
модуль 02 основы языка программирования c#
Yevgeniy Gertsen
 

More from Yevgeniy Gertsen (19)

модуль 18 сериализация объектов
модуль 18 сериализация объектовмодуль 18 сериализация объектов
модуль 18 сериализация объектов
 
модуль 17 основы xml
модуль 17 основы xmlмодуль 17 основы xml
модуль 17 основы xml
 
модуль 16 взаимодействие с файловой системой
модуль 16 взаимодействие с файловой системоймодуль 16 взаимодействие с файловой системой
модуль 16 взаимодействие с файловой системой
 
модуль 14 введение в generics
модуль 14 введение в genericsмодуль 14 введение в generics
модуль 14 введение в generics
 
модуль 15 сборка мусора. рефлексия
модуль 15 сборка мусора. рефлексиямодуль 15 сборка мусора. рефлексия
модуль 15 сборка мусора. рефлексия
 
модуль 13 использование коллекций
модуль 13 использование коллекциймодуль 13 использование коллекций
модуль 13 использование коллекций
 
модуль 12 делегаты, события
модуль 12 делегаты, событиямодуль 12 делегаты, события
модуль 12 делегаты, события
 
модуль 11 структуры, перечисления
модуль 11 структуры, перечислениямодуль 11 структуры, перечисления
модуль 11 структуры, перечисления
 
Модуль 10 Интерфейсы
Модуль 10 ИнтерфейсыМодуль 10 Интерфейсы
Модуль 10 Интерфейсы
 
модуль 09-01
модуль 09-01модуль 09-01
модуль 09-01
 
модуль 08
модуль 08модуль 08
модуль 08
 
Модуль 07 Перегрузка операторов
Модуль 07 Перегрузка операторовМодуль 07 Перегрузка операторов
Модуль 07 Перегрузка операторов
 
модуль 06 пространства имен
модуль 06 пространства именмодуль 06 пространства имен
модуль 06 пространства имен
 
модуль 04
модуль 04модуль 04
модуль 04
 
модуль 05 обработка исключений
модуль 05 обработка исключениймодуль 05 обработка исключений
модуль 05 обработка исключений
 
модуль 03 строки
модуль 03 строкимодуль 03 строки
модуль 03 строки
 
модуль 03 массивы
модуль 03 массивымодуль 03 массивы
модуль 03 массивы
 
модуль 02 основы языка программирования c#
модуль 02 основы языка программирования c#модуль 02 основы языка программирования c#
модуль 02 основы языка программирования c#
 
модуль 01 введение в платформу microsoft .net
модуль 01 введение в платформу microsoft .netмодуль 01 введение в платформу microsoft .net
модуль 01 введение в платформу microsoft .net
 

модуль 17 основы xml

Editor's Notes

  1. Язык XML предназначен для хранения и передачи данных. HTML же предназначен для отображения данных
  2. Недавно в этом учебнике вы узнали о базовых правилах XML-документов; это все хорошо, но вам нужно определить элементы, которые вы собираетесь использовать для представления данных. Вы узнаете о двух способах сделать это в данном разделе. Одним методом является использование Document Type Definition или DTD (Определение Типа Документа). DTD определяет элементы, которые могут появляться в XML-документе, порядок, в котором они могут появляться, как они могут быть вложены друг в друга и другие основные детали структуры XML-документа. DTD являются частью исходной спецификации XML и они очень похожи на DTD в SGML. Другим методом является использование XML Schema (схема XML). Схема может определить все то в структуре документа, что вы можете поместить в DTD, и может также определить типы данных и более сложные правила, чем DTD. W3C разработала спецификацию XML Schema через пару лет после исходной спецификации XML.
  3. Определение типов документа (document type definition - DTD) декларирует допустимые строительные блоки XML документа. Оно задает структуру документа со списком допустимых элементов и атрибутов. DTD может декларироваться как в коде самого XML документа, так и во внешнем файле с подключением его к XML документу.
  4. С DTD каждый ваш XML файл может нести описание своего собственного формата. С DTD различные, не связанные друг с другом, группы людей могут приходить к соглашению о стандартах взаимно обмениваемых данных. С DTD вы можете быть уверены, что получаемые из внешних источников данные будут корректными. Также, вы можете использовать DTD, чтобы проводит проверки корректности своих собственных данных.
  5. Если DTD декларируется внутри XML файла, то она должны быть заключена в специальный тег декларации DOCTYPE, который имеет следующий синтаксис: &amp;lt;!DOCTYPE orders [ ]&amp;gt; exmpl_01 DTD в приведенном примере интерпретируется следующим образом: !DOCTYPE note определяет, что корневым элементом документа является note !ELEMENT note определяет, что элемент note содержит четыре элемента: to, from, heading, body !ELEMENT to определяет, что элемент to должен быть типа &amp;quot;#PCDATA&amp;quot; !ELEMENT from определяет, что элемент from должен быть типа &amp;quot;#PCDATA&amp;quot; !ELEMENT heading определяет, что элемент heading должен быть типа &amp;quot;#PCDATA&amp;quot; !ELEMENT body определяет, что элемент body должен быть типа  &amp;quot;#PCDATA&amp;quot; ---------------------------------------------------------------------------------------------------------------------- PCDATA PCDATA – Анализируемые символьные данные PCDATA означает анализируемые символьные данные. Обычно XML парсеры анализируют и разбирают все текстовые данные в XML документе. Когда парсится XML элемент, текст между тегами XML также анализируется: &amp;lt;message&amp;gt;Этот текст тоже парсится&amp;lt;/message&amp;gt; Это делается по той причине, что XML элементы могут содержать другие элементы. Например, в следующем примере элемент &amp;lt;name&amp;gt; содержит еще два элемента (first и last): &amp;lt;name&amp;gt;&amp;lt;first&amp;gt;Bill&amp;lt;/first&amp;gt;&amp;lt;last&amp;gt;Gates&amp;lt;/last&amp;gt;&amp;lt;/name&amp;gt; и парсер разобьет его на подэлементы следующим образом: &amp;lt;name&amp;gt; &amp;lt;first&amp;gt;Bill&amp;lt;/first&amp;gt; &amp;lt;last&amp;gt;Gates&amp;lt;/last&amp;gt; &amp;lt;/name&amp;gt; &amp;quot;Анализируемые символьные данные&amp;quot; (PCDATA) это термин, используемый по отношению к текстовым данным, которые подвергаются анализу и разбору XML парсером. ---------------------------------------------------------------------------------------------------------------------- CDATA CDATA - (Неанализируемые) Символьные данные CDATA — это текст, который не будет анализироваться парсером. Теги внутри такого текста не будут восприняты, как вложенная разметка, а сущности не будут раскрыты. Термин CDATA используется по отношению текстовых данных, которые не должны анализироваться и разбираться XML парсером. Символы вроде &amp;quot;&amp;lt;&amp;quot; и &amp;quot;&amp;&amp;quot; недопустимы внутри XML элементов. Символ &amp;quot;&amp;lt;&amp;quot; вызовет ошибку, потому что парсер будет интерпретировать его, как начало нового элемента. Символ &amp;quot;&amp;&amp;quot; вызовет ошибку, потому что парсер будет интерпретировать его, как начало символьной сущности. Тем не менее, некоторые текстовые данные, например, код JavaScript, могут содержать множество символов &amp;quot;&amp;lt;&amp;quot; и &amp;quot;&amp;&amp;quot;. Чтобы избежать возникновения ошибок парсинга, такие текстовые данные можно определить, как CDATA. Все что расположено внутри секции CDATA полностью игнорируется парсером. Секция CDATA начинается с символов &amp;quot;&amp;lt;![CDATA[&amp;quot; и заканчивается &amp;quot;]]&amp;gt;&amp;quot;:
  6. Декларация элементов Элементы с потомками (последовательности) – (Элементы с одним или более потомком декларируются с именем дочернего элемента в скобках). Когда потомки декларируются в последовательности разделенные запятыми, они должны появляться в том же самом порядке. В полной декларации дочерние элементы также должны быть декларированы. Кроме этого, дочерние элементы также могут иметь потомки. Ниже представлена полная декларация элемента “order“ Элементы с анализируемыми символьными данными - (Элементы, содержащие только анализируемые символьные данные, декларируются при помощи ключевого слова #PCDATA)
  7. Элементы с любым контентом - (Элементы, декларированные с ключевым словом категории ANY, могут содержать любую комбинацию анализируемых данных) Пустые элементы Декларация единичного элемента – (Декларируется, что элемент “Brand&amp;quot; должен содержать только один дочерний элемент &amp;quot;BrandName “)
  8. Декларация минимум одного элемента – (Знак + декларирует, что элемент &amp;quot;Article&amp;quot; должен содержать один или более дочерних элементов &amp;quot;ArticleName “) Декларирование от нуля и больше элементов – (Знак * декларирует, что элемент &amp;quot;Article&amp;quot; может содержать сколько угодно дочерних элементов &amp;quot;ArticleName&amp;quot;, либо не содержать их вообще) Декларирование от нуля до одного элемента – (Знак ? декларирует, что элемент &amp;quot;Article&amp;quot; может содержать только один дочерний элемент &amp;quot;ArticleName&amp;quot;, либо не содержать его вообще)
  9. Декларирование альтернативных элементов– (Декларируется, что элемент &amp;quot;Article&amp;quot; должен содержать элементы &amp;quot;ArticleName&amp;quot;, &amp;quot;ArticleId&amp;quot; и либо элемент &amp;quot;ArticleGuid&amp;quot;, либо элемент “Article1CGuid&amp;quot;.) Декларирование смешанного контента – (Декларируется, что элемент &amp;quot;Article&amp;quot; может содержать сколько угодно анализируемых символьных данных, элементов &amp;quot;ArticleName&amp;quot; или &amp;quot;ArticleId&amp;quot;, либо не содержать их вообще.)
  10. Параметр &amp;quot;значение-атрибута&amp;quot; может принимать следующие значение
  11. Value Значение атрибута по умолчанию – (В приведенном примере элемент &amp;quot;order&amp;quot; декларируется, как пустой элемент с атрибутом &amp;quot;Id&amp;quot;, который имеет тип CDATA. Если атрибут &amp;quot;Id&amp;quot; не задан, то он будет иметь значение по умолчанию 0.) #REQUIRED Атрибут обязателен – (Используйте ключевое слово #REQUIRED, если у вас нет вариантов по значению по умолчанию, но вам все же нужно, чтобы атрибут обязательно присутствовал.) #IMPLIED Атрибут не обязателен – (Ключевое слово #IMPLIED используется, если нет необходимости в обязательном использовании атрибута, и нет вариантов по значению по умолчанию.) #FIXED value Атрибут имеет фиксированное значение – (Ключевое слово #FIXED используется, когда необходимо, чтобы у атрибута было некое фиксированное значение, которое автор XML файла не может изменять. Если автор XML файла задаст другое значение такого атрибута, то парсер вернет ошибку.)
  12. Если DTD декларируется во внешнем файле, то подключение осуществляется следующим образом: &amp;lt;!DOCTYPE корневой-элемент SYSTEM &amp;quot;имя файла&amp;quot;&amp;gt; Ниже приводится тот же XML документ, что и ранее, но с внешней декларацией DTD: exmpl_02 А вот что содержится в файле &amp;quot;note.dtd&amp;quot;, который декларирует DTD:
  13. Теперь пришло время узнать, что такое XML схемы. XML схемы, также как DTD, используются для определения допустимых элементов XML документа. Думается, что очень скоро XML схемы будут использоваться в большинстве веб-приложениях вместо DTD, так как XML схемы это основанная на XML альтернатива DTD. В отличие от DTD, XML схемы поддерживают типы данных и пространства имен.
  14. XML схема описывает структуру XML документа. Язык XML схем также называют Определение схемы XML или XSD (от анг. XML Schema Definition). exmpl_03 ------------------------------------------------------------------------------ XML схема — это основанная на XML альтернатива DTD. XML схема описывает структуру XML документа. Подобно DTD, XML схемы предназначены для определения допустимых строительных блоков XML документа. XML схема: определяет элементы, которые могут появляться в XML документе определяет атрибуты, которые могут появляться в XML документе определяет, какие элементы являются дочерними определяет порядок дочерних элементов определяет количество дочерних элементов определяет, пустой ли элемент или может содержать текст определяет типы данных элементов и атрибутов определяет фиксированные значения и значения по умолчанию элементов и атрибутов XML схема — преемник DTD Думается, что очень скоро XML схемы будут использоваться в большинстве веб-приложениях, как замена DTD. И вот некоторые причины этого: XML схемы легко расширяются XML схемы - более мощный инструмент, чем DTD XML схемы пишутся на XML XML схемы поддерживают типы данных XML схемы поддерживают пространства имен
  15. XML схемы — это более мощный инструмент определения типов документов, чем DTD. XML схемы поддерживают типы данных Один из самых больших плюсов XML схем это поддержка типов данных. Поддержка типов данных позволяет: описывать допустимый контент документа проверять корректность данных работать с данными из базы данных определять аспекты данных (ограничения по данным) определять модели данных (форматы данных) конвертировать данные между различными типами данных XML схемы используют синтаксис XML Еще одним значительным плюсом XML схем является то, что схемы пишутся на XML. То, что XML схемы пишутся на XML, дает следующие преимущества: не нужно изучать новый язык программирования для редактирования схем можно использовать привычный XML редактор для разбора файлов схем можно использовать тот же XML парсер можно манипулировать XML схемами при помощи XML DOM можно трансформировать XML схемы при помощи XSLT XML схемы обеспечивают безопасную передачу данных При посылке данных от отправителя к получателю крайне важно, чтобы оба участника имели одинаковые &amp;quot;ожидания&amp;quot; по поводу контента. При помощи XML схем отправитель может описать данные таким образом, что получатель без труда их поймет. Например, запись даты: &amp;quot;03-11-2004&amp;quot; в одних странах будет понята, как 3 Ноября, а в других, как 11 Марта. &amp;lt;date type=&amp;quot;date&amp;quot;&amp;gt;2004-03-11&amp;lt;/date&amp;gt;
  16. XML документ может иметь либо подключение к DTD, либо к XML схеме. exmpl_04
  17. Элемент &amp;lt;schema&amp;gt; - это корневой элемент каждой XML схемы: &amp;lt;?xml version=«1.0&amp;quot;?&amp;gt; &amp;lt;xs:schema&amp;gt; ... &amp;lt;/xs:schema&amp;gt; Элемент &amp;lt;schema&amp;gt; может содержать некоторые атрибуты. Часто декларация схемы имеет, например, такой вид: exmpl_05 Фрагмент xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; указывает на то, что используемые в схеме элементы и типы данных относятся к пространству имен &amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;. Также здесь указывается, что элементы и типы данных, относящиеся к пространству имен &amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;, должны иметь префикс xs: Фрагмент targetNamespace=&amp;quot;http://msiter.ru&amp;quot; указывает на то, что определяемые этой схемой элементы (note, to, from, heading, body) относятся к пространству имен &amp;quot;http://msiter.ru&amp;quot;. Фрагмент xmlns=&amp;quot;http://msiter.ru&amp;quot; указывает на то, что пространством имен по умолчанию является &amp;quot;http://msiter.ru&amp;quot;. Фрагмент elementFormDefault=&amp;quot;qualified&amp;quot; указывает на то, что любой элемент, используемый в XML документе, который был декларирован в этой схеме, должен быть уточнен по пространству имен.
  18. Следующий XML документ имеет подключение к XML схеме: exmpl_06 Здесь фрагмент xmlns=&amp;quot;http://msiter.ru&amp;quot; определяет декларацию пространства имен по умолчанию. Эта декларация говорит валидатору схем, что все элементы, использованные в данном XML документе, декларированы в пространстве имен &amp;quot;http://msiter.ru&amp;quot;. Благодаря тому, что в фрагменте xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; мы сделали доступным пространство имен образцов XML схемы, мы можем использовать атрибут schemaLocation. У этого атрибута есть два значения, разделенных пробелом. Первое значение — используемое пространство имен. Второе значение — расположение XML схемы, которая используется в этом пространстве имен. Что мы и определяем в рагменте xsi:schemaLocation=&amp;quot;http://msiter.ru note.xsd&amp;quot;.
  19. Простой элемент — это элемент XML, который содержит только текст. Простой элемент не может содержать другие элементы или атрибуты. Тем не менее, ограничение &amp;quot;только текст&amp;quot; достаточно обманчиво. Текст может быть самых разных типов. Это может быть одним из типов, включенных в определение XML схем (boolean, string, date и т.д.), либо это может быть пользовательский тип, определенный вами. Также, вы сами можете добавить ограничения (аспекты) по типу данных, чтобы лимитировать контент, либо вы можете указать требование, чтобы данные соответствовали определенной модели. Определение простого элемента Чтобы определить простой элемент, используется следующий синтаксис: &amp;lt;xs:element name=&amp;quot;xxx&amp;quot; type=&amp;quot;yyy&amp;quot;/&amp;gt; где xxx — имя элемента, а yyy — тип данных элемента. XML схемы имеют множество встроенных типов данных. Наиболее часто используемыми являются следующие типы: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time Значения по умолчанию и фиксированные значения Простые элементы могут иметь значения по умолчанию ИЛИ фиксированные значения. Значение по умолчанию присваивается элементу автоматически, если не определено никакого другого значения. Открыть - exmpl_08 В следующем примере &amp;quot;red&amp;quot; - значение по умолчанию: &amp;lt;xs:element name=&amp;quot;color&amp;quot; type=&amp;quot;xs:string&amp;quot; default=&amp;quot;red&amp;quot;/&amp;gt; Фиксированное значение также присваивается элементу автоматически, но при этом вы не можете определить никакого другого значения. В следующем примере &amp;quot;red&amp;quot; — фиксированное значение: &amp;lt;xs:element name=&amp;quot;color&amp;quot; type=&amp;quot;xs:string&amp;quot; fixed=&amp;quot;red&amp;quot;/&amp;gt;
  20. Все атрибуты декларируются, как простые типы. Простые элементы не могут иметь атрибуты. Если у элемента есть атрибуты, то он относится к комплексным или составным типам. Но сам по себе атрибут всегда декларируется, как простой тип. exmpl_09 Определение атрибута Атрибут декларируется следующим образом: &amp;lt;xs:attribute name=&amp;quot;xxx&amp;quot; type=&amp;quot;yyy&amp;quot;/&amp;gt; где xxx — имя атрибута, а yyy — тип данных атрибута. XML схемы имеют множество встроенных типов данных. Наиболее часто используемыми являются следующие типы: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time Значения по умолчанию и фиксированные значения Атрибуты могут иметь значения по умолчанию ИЛИ фиксированные значения. Значение по умолчанию присваивается атрибуту автоматически, если не определено никакого другого значения. В следующем примере &amp;quot;EN&amp;quot; — значение по умолчанию: &amp;lt;xs:attribute name=&amp;quot;lang&amp;quot; type=&amp;quot;xs:string&amp;quot; default=&amp;quot;EN&amp;quot;/&amp;gt; Фиксированное значение также присваивается атрибуту автоматически, но при этом вы не можете определить никакого другого значения. В следующем примере &amp;quot;EN&amp;quot; — фиксированное значение: &amp;lt;xs:attribute name=&amp;quot;lang&amp;quot; type=&amp;quot;xs:string&amp;quot; fixed=&amp;quot;EN&amp;quot;/&amp;gt; Обязательные и необязательные атрибуты По умолчанию атрибуты являются необязательными для использования. Чтобы декларировать обязательный атрибут, следует воспользоваться атрибутом &amp;quot;use&amp;quot;: &amp;lt;xs:attribute name=&amp;quot;lang&amp;quot; type=&amp;quot;xs:string&amp;quot; use=&amp;quot;required&amp;quot;/&amp;gt; Ограничения по контенту Если XML элемент или атрибут имеет определение типа данных, то это накладывает ограничение по контенту этого элемента или атрибута. Если XML элемент имеет тип &amp;quot;xs:date&amp;quot; и содержит строку, например, &amp;quot;Hello World&amp;quot;, то этот элемент не пройдет валидацию или проверку на корректность данных. При помощи XML схем вы также можете добавлять свои собственные ограничения для своих XML элементов и атрибутов. Эти ограничения еще называют аспектами или фасетами.
  21. Если вы имеется отношение к созданию сайтов, вы наверняка слышали об XML, даже если ещё не использовали его в работе. В таком случае, настало время познакомиться, ведь пережив настоящий бум, за последний десяток лет этот новый формат вырос из новаторского проекта в настоящий промышленный стандарт, и чуть ли не ежедневно появляются сообщения о примерах его успешного использования.  Но универсальность текстового формата XML оборачивается вполне очевидным неудобством - перед извлечением данных из документа надо как следует помучиться с синтаксическим анализом текста и определением его структуры. Реализация всех необходимых процедур вручную - весьма нетривиальное занятие, и потребует немалых усилий. Одним из стандартных механизмов, позволяющих упростить жизнь разработчиков, и являются парсеры.  Что же это такое? XML-парсер - это программа, предназначенная для анализа содержимого текстового документа, который соответствует спецификации XML. Ей достается вся &amp;quot;чёрная&amp;quot; работа: получение общих сведений о документе, анализ текста, поиск в нем служебных конструкций (элементов, атрибутов, сущностей и т.п.), проверка на соблюдение синтаксических правил, а также предоставление интерфейса для доступа к документу. В результате аккуратно извлеченные данные, будут переданы пользовательскому приложению, которое может вообще ничего не знать о том, что такое XML.  Парсер может быть выполнен в виде отдельного программного модуля или ActiveX-компонента, может подключаться к приложению через специальные библиотеки классов на этапе компиляции или выполнения. Парсеры делятся на верифицирующие (validating) и неверифицирующие (non-validating). Первые могут проверять структуру документа на основе DTD или схем данных, вторые же об этом не заботятся - и потому имеют, как правило, меньший размер. Многие из современных парсеров &amp;quot;нагружены&amp;quot; многочисленными дополнительными возможностями (расширенная обработка ошибок, добавление и редактирование данных), что делает их более удобными в работе, хотя и повышает размер программ. Наиболее распространенным и известным является парсер Expat, написанный Джеймсом Кларком - одним из создателей спецификации XML. Другой распространенный парсер - Xerces
  22. В этом разделе рассматривается ряд программных интерфейсов для XML. Эти интерфейсы дают разработчикам целостный интерфейс для работы с XML-документами. Существует много доступных API; в этом разделе рассматриваются две из них, наиболее популярные и наиболее часто используемые: Объектная Модель Документа (Document Object Model - DOM) Простой API для XML (Simple API for XML - SAX
  23. Чтобы обойти проблемы DOM, участники XML-DEV (возглавляемой David Megginson) создали интерфейс SAX. SAX имеет несколько характеристик, направленных на преодоление недостатков DOM: Парсер SAX посылает в ваш код события. Парсер сообщает вам, когда он находит начало элемента, конец элемента, текст, начало и конец документа и т.д. Вы решаете, какие события важны для вас, вы решаете, какой вид структуры данных вы хотите создать для хранения данных из этих событий. Если вы явным образом не сохраняете данные из этих событий, они теряются. Парсер SAX не создает никаких объектов вообще, он просто доставляет события в ваше приложение. Если вы хотите создавать объекты на основе этих событий - это ваше дело. Парсер SAX начинает доставляет вам события сразу же после начала своей работы. Ваш код получить событие, когда парсер найдет начало документа, когда он найдет начало элемента, когда он найдет текст и т.д. Ваше приложение сразу же начнет генерировать результаты и не будет должно ожидать, пока будет разобран весь документ. Даже лучше, если вы ищете только определенные вещи в документе, ваш код может сгенерировать исключение, если он нашел то, что искал. Исключение останавливает парсер SAX, и ваш код может делать то, что ему нужно сделать с найденными данными Проблемы SAX Чтобы быть честными, парсеры SAX также имеют проблемы, которые могут вызывать опасения: События SAX не сохраняют состояния. Когда парсер SAX находит текст в XML-документе, он посылает событие в ваш код. Это событие просто дает вам найденный текст; оно не сообщает вам, какой элемент содержит этот текст. Если вы хотите знать это, вы должны написать код, управляющий состоянием, сами. События SAX не сохраняются. Если вашему приложению нужна структура данных, которая моделирует XML-документ, вы должны написать этот код сами. Если вам нужно обращаться к данным из события SAX, и вы не сохранили данные в вашем коде, вы должны разобрать документ снова. SAX не управляется централизованной организацией. Хотя пока это не составило проблем, некоторым разработчикам показалось бы более комфортабельным, если бы SAX управляется организацией, такой как W3C.
  24. SAX анализирует поток XML и проходит через, как по телетайпной ленте. Рассмотрим следующий XML-код: &amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; &amp;lt;samples&amp;gt; &amp;lt;server&amp;gt;UNIX&amp;lt;/server&amp;gt; &amp;lt;monitor&amp;gt;color&amp;lt;/monitor&amp;gt; &amp;lt;/samples&amp;gt; Процессор SAX, анализирующий этот код, будет генерировать, как правило, следующие события: SAX API дает возможность разработчику выловить эти события и работать по ним. Обработка в SAX включает в себя следующие шаги: Создание обработчика событий. Создание парсера SAX. Назначение обработчика событий для парсера. Разбор документа с посылкой каждого события в обработчик. За и против событийно-базированной обработки Преимущества этого вида обработки очень похожи на преимущества потоковых носителей. Анализ может начинаться немедленно, а не ожидать всех данных для обработки. Также поскольку работает с данными по мере их поступления, не требуется сохранять их в памяти. Это огромное преимущество, когда поступают большие документы. Фактически, приложение даже не должно разбирать весь документ; оно может остановиться, когда будут удовлетворены некоторые критерии. В общем случае SAX также значительно быстрее, чем его альтернатива, DOM. С другой стороны, поскольку приложение не сохраняет каким-либо образом данные, невозможно при помощи SAX делать в них изменения или возвращаться назад по потоку данных.
  25. Объектная Модель Документа, обычно называемая DOM, определяет набор интерфейсов для разобранной версии XML-документа. Парсер читает весь документ и строит дерево в памяти, так что ваш код может использовать интерфейсы DOM для манипулирования деревом. Вы можете двигаться по дереву, чтобы увидеть, что содержал исходный документ, вы можете удалять части дерева, вы можете переупорядочить дерево, добавлять новые ветви и т.д. DOM была создана W3C, и это - Официальная Рекомендация консорциума. Проблемы DOM DOM обеспечивает богатый набор функций, которые вы можете использовать для интерпретации XML-документа и манипулирования им, но за эти функции надо платить. Когда была разработана исходная DOM для XML-документов, многие люди в списке рассылки XML-DEV выразили беспокойство по поводу ее: DOM строит в памяти дерево всего документа. Если документ очень большой, это требует значительного объема памяти. DOM создает объекты, которые представляют все, что есть в исходном документе, включая элементы, текст, атрибуты и пропуски. Если вам нужно иметь дело только с небольшой порцией исходного документа, то крайне расточительно создавать все эти объекты, которые никогда не будут использованы. Парсер DOM должен прочитать весь документ прежде, чем ваш код получит управление. Для очень больших документов это может привести к значительной задержке. Это только спорные вопросы, возникшие при проектировании DOM; несмотря на это, API DOM является очень удобным способом для разбора XML-документов. Основой Расширяемого Языка Разметки, Extensible Markup Language или XML является DOM. XML-документы содержат иерархию информационных единиц, называемых узлами; DOM является способом описания этих узлов и отношений между ними. Вдобавок к ее роли концептуального описания XML-данных, DOM является серией Рекомендаций, вырабатываемых Консорциумом World Wide Web (W3C). DOM начиналась как способ для Web-браузеров для идентификации и манипулирования элементами на странице - функциональности, которая еще предшествовала вовлечению в нее W3C и известна, как &amp;quot;DOM, Уровень 0&amp;quot;. DOM как структура Прежде, чем начинать работу с DOM, стоит получить представление о том, что она на самом деле представляет. Объект DOM Document является коллекцией узлов или порций информации, организованных в иерархию. Эта иерархия позволяет разработчику двигаться по дереву в поисках нужной информации. Анализ структуры обычно требует, чтобы был загружен полный документ, и иерархия была построена до начала работы. Поскольку DOM основывается на иерархии информации, про нее говорят, что она древовидно-базированная или объектно-базированная. Для исключительно больших документов разбор и загрузка полного документа может быть медленной и ресурсоемкой, так что для работы с такими данными могут оказаться лучшими другие средства. Событийно-базированные модели, такие, как Simple API for XML (SAX), работают на потоке данных, обрабатывая его по мере поступления. (SAX является темой другого учебника и других статей в XML-зоне developerWorks. Дополнительную информацию см. в Ресурсы.) Событийно-базированный API обходит необходимость построения дерева в памяти, но фактически не позволяет разработчику изменять данные в исходном документе.