
- •Лабораторная работа № 14 Язык xml (extensible Markup Language, расширяемый язык разметки)
- •Листинг 14.1. Пример xml - документа
- •Листинг 14.2. Пример xml-документа с атрибутами в открывающем теге
- •Пространство имен тегов
- •Строки символов
- •Дата и время
- •Объединение
- •Описание элементов и их атрибутов
- •Определение сложных типов
- •Определение типа пустого элемента
- •Определение типа элемента с простым телом
- •Определение типа вложенных элементов
- •Определение типа со сложным телом
- •Пространства имен языка xsd
- •Листинг 14.5. Схема документа xml с целевым пространством имен
- •Включение файлов схемы в другую схему
- •Связь документа xml со своей схемой
- •Другие языки описания схем
- •Инструкции по обработке
- •Анализ документа xml
Пространство имен тегов
Поскольку в разных языках разметок — реализациях XML — могут встретиться одни и те же имена тегов и их атрибутов, имеющие совершенно разный смысл, а в документе XML их часто приходится смешивать, анализатору надо дать возможность их как-то различать. Для этого имена тегов и атрибутов снабжают префиксом, который отделяется от имени двоеточием. Префикс имени связывается с идентификатором, определяющим пространство имен (namespace). Все имена тегов и атрибутов, префиксы которых связаны с одним и тем же идентификатором, образуют одно пространство имен. Префикс и идентификатор пространства имен определяются атрибутом xmlns следующим образом:
<ntb:notebook xmlns:ntb = "http://some.firm.com/2003/ntbml">
Как видите, префикс ntb только что определен, но его уже можно использовать в имени ntb:notebook. В дальнейшем имена тегов и атрибутов, которые мы хотим отнести к пространству имен http://some.firm.com/2003/ntbml. снабжаются префиксом ntb, например:
<ntb:city ntb:type="поселок”>Горелово</ntb:city>
Имя вместе с префиксом, например, ntb:city, называется расширенным или уточненным именем QName (Qualified Name).
Идентификатор пространства имен должен иметь форму URI. Адрес URI, такой как http://some.firm.com/2003/ntbml, не имеет никакого значения и может не соответствовать никакому действительному адресу. Анализатор документа XML и другие программы, использующие документ, не будут обращаться по этому адресу. Там даже нет никакой Web-странички. Просто идентификатор пространства имен должен быть уникальным во всем Интернете, и разработчики рекомендации по применению пространства имен, которую можно посмотреть по адресу http://www.w3.org/TR/I999/REC-xml- names-19990114/, справедливо решили, что будет удобно использовать для него DNS-имя сайта, на котором размешено определение пространства имен. Смотрите на URI просто как на строку символов, идентифицирующую пространство имен. Обычно указывается URL (Universal Resource Locator, адрес универсальных ресурсов) фирмы, создавшей данную реализацию XML, или имя файла с описанием схемы XML.
По правилам SGML и ХМL двоеточие может применяться в именах как обычный символ, поэтому имя с префиксом — это просто фокус, анализатор рассматривает его как обычное имя. Отсюда следует, что в описании DTD нельзя опускать префиксы имен. Некоторым анализаторам надо специально указать необходимость учета пространства имен.
Атрибут xmlns может появиться в любом элементе XML. а не только в корневом элементе. Определенный им префикс можно применять в том элементе, в котором записан атрибут xmlns, и во всех вложенных в него элементах. Больше того, в одном элементе можно определить несколько пространств имен:
<ntb:notebook
xmlns:ntb = "http://some.firm.com/2003/ntbml"
xmlns:bk = "http://some.firm.com/2003/bookral”>
Появление имени тега без префикса в документе, использующем пространство имен, означает, что имя принадлежит пространству имен по умолчанию (default namespace). Например, язык XHTML допускает применение тегов HTML и тегов XML в одном документе. Допустим, мы определили тег с именем title. Чтобы анализатор не принял его за один из тегов HTML, поступаем следующим образом:
<html xmlns = "http://www.w3.org/1999/xhtml”
xmlns:ntb = “http://some.firm.com/2002/ntbml”>
<head>
<title>Моя библиотека</title>
</head>
<body>
<ntb:book>
<ntb:title>Создание Java Web Services</ntb:title>
</ntb:book>
</body>
</html>
В этом примере пространством имен по умолчанию становится пространство имен XHTML, имеющее общеизвестный идентификатор http://www.w3.org/1999/xhtml, и теги, относящиеся к этому пространству имен, записываются без префикса.
Атрибуты никогда не входят в пространство имен по умолчанию. Если имя атрибута записано без префикса, то это означает, что атрибут не относится ни к одному пространству имен.
Теперь, после того как мы ввели понятие пространства имен, можно обратиться к схеме XML.
Схема XML
В мае 2001 года консорциум W3C (WWW Consortium) рекомендовал описывать структуру документов XML на языке описания схем XSD. На этом языке записываются схемы XML (XML Schema), описывающие элементы документов XML.
Схема XML сама записывается как документ XML. Его элементы называют компонентами (components), чтобы отличить их от элементов описываемого документа XML. Корневой компонент схемы носит имя <schema>. Компоненты схемы описывают элементы XML и определяют различные типы элементов. Рекомендация схемы XML, которую можно посмотреть по адресу http://www.w3.org/xml/schema/. перечисляет 13 типов компонентов, но наиболее важны компоненты, определяющие простые и сложные типы элементов, сами элементы и их атрибуты.
Язык XSD различает простые и сложные элементы XML. Простыми (simple) элементами описываемого документа XML считаются элементы, не содержащие атрибутов и вложенных элементов. Соответственно, сложные (complex) элементы содержат атрибуты и/или вложенные элементы. Схема XML описывает простые типы — типы простых элементов, и сложные типы — типы сложных элементов.
Язык описания схем содержит много встроенных простых типов. Они перечислены в следующем разделе.
Встроенные простые типы XSD
Встроенные типы языка описания схем XSD позволяют записывать двоичные и десятичные целые числа, вещественные числа, дату и время, строки символов, логические значения, адреса URI. Рассмотрим их по порядку.
Вещественные числа
Вещественные числа в языке XSD разделены на три типа: decimal, float и double.
Тип decimal составляют вещественные числа, записанные с фиксированной точкой: 123.45, -0.1234567689345 и так далее. Фактически хранятся два целых числа: мантисса и порядок. Спецификация языка XSD не ограничивает количество цифр в мантиссе, но требует, чтобы можно было записать не менее 18 цифр.
Типы float и double соответствуют стандарту IEEE754-85. Они записываются с фиксированной или с плавающей десятичной точкой.
Целые числа
Основной целый тип integer понимается как подтип типа decimal, содержащий числа с нулевым порядком. Это целые числа с любым количеством десятичных цифр: -34567, 123456789012345 и так далее.
Типы long, int, short и byte понимаются как подтипы типа integer, типы более коротких чисел считаются подтипами более длинных чисел: тип byte — это подтип типа short, оба они подтипы типа int, и так далее.
Типы nonPositivelnteger и negativeInteger— подтипы типа integer — составлены из неположительных и отрицательных чисел соответственно с любым количеством цифр.
Типы nonNegativeinteger и positiveInteger— подтипы типа integer — составлены из неотрицательных и положительных чисел соответственно с любым количеством цифр.
У типа nonNegativeInteger есть подтипы без знаковых целых чисел: unsignedLong, unsignedInt, unsignedShort и unsignedByte.