Встроенные простые типы. Определение простых типов

Встроенные простые типы. Определение простых типов

Встроенные простые типы

Для более точного описания схемы документа, учитывающего тип содержимого элемента, количество повторений вложенного элемента и другие подробности, в мае 2001 года консорциум W3C рекомендовал описывать структуру документов XML на новом языке описания схем XSD (XML Schema Definition Language). На этом языке записывается схема XML (XML Schema), описывающая конструкции, использованные в документе XML.

Язык XSD создан как реализация XML. Это значит, что схема XML сама записывается в виде документа XML. Ее элементы называют компонентами (components), чтобы отличить их от элементов описываемого документа XML. Корневой компонент схемы носит имя schema. Компоненты схемы описывают элементы XML и определяют различные типы элементов. Рекомендация схемы XML перечисляет 13 типов компонентов, но наиболее важны компоненты, определяющие простые и сложные типы элементов, сами элементы и их атрибуты.

Язык XSD различает простые и сложные элементы XML. Простыми (simple) элементами описываемого документа XML считаются элементы, не содержащие атрибутов и вложенных элементов. Соответственно, сложные (complex) элементы содержат атрибуты и/или вложенные элементы. Схема XML определяет простые типы — типы простых элементов, и сложные типы — типы сложных элементов. Язык описания схем содержит множество встроенных простых типов, перечисленных в следующем разделе.

Встроенные типы языка описания схем XSD позволяют записывать двоичные и десятичные целые числа, вещественные числа, дату и время, строки символов, логические значения, адреса URI. Рассмотрим их по порядку.

Вещественные числа

Вещественные числа в языке XSD разделены на три типа: decimal, float и double.

Тип decimal составляют вещественные числа, записанные с фиксированной точкой: 123.45, —0.1234567689345 и т. д. Фактически хранятся два целых числа. Одно число представляет мантиссу, другое — порядок вещественного числа. Спецификация языка XSD не ограничивает количество цифр в мантиссе, но требует, чтобы можно было записать не менее 18 цифр. При обработке документа средствами технологии Java этот тип легко реализуется, например, классом java.math.BigDecimal, входящим в стандарт Java API.

Типы float и double соответствуют стандарту IEEE754-85 и одноименным типам Java. Они записываются с фиксированной или с плавающей десятичной точкой. Например, 34.567, -45.67, 1е-5, 34.58е14.

Целые числа

Основной целый тип integer понимается как подтип типа decimal, содержащий числа с нулевым порядком. Это целые числа с любым количеством десятичных цифр: -34567, 123456789012345 и т. д. При использовании средств Java для обработки документа этот тип легко реализуется классом java.math.Biglnteger.

Типы long, int, short и byte полностью соответствуют одноименным типам Java. Они понимаются как подтипы типа integer, типы более коротких чисел считаются подтипами более длинных чисел, например, тип byte - это подтип типа short, оба они подтипы типа int и т. д.

Значения типа byte, как следует из его названия, занимают один байт и изменяются от -128 до 127. Тип short занимает два байта, его значения лежат в диапазоне от -32768 до +32767. Числа типа int хранятся в четырех байтах и меняются от -214748.3648 до +2147483647. Наконец, тип long располагается в восьми байтах, его значения от -9223372036854775808 до +9223372036854775807.

Типы nonPositiveInteger и negativeInteger - подтипы типа integer - составлены из неположительных и отрицательных чисел соответственно с любым количеством цифр.

Типы nonNegativeInteger и positiveInteger – подтипы типа integer — составлены из неотрицательных и положительных чисел соответственно с любым количеством цифр.

У типа nonNegativeInteger есть подтипы целых чисел без знака unsignedLong, unsignedInt, unsignedShort и unsignedByte.

Строки символов

Основной символьный тип string описывает произвольную строку символов Unicode. Его можно реализовать средствами Java, используя класс Java.lang.String.

Тип normalizedstring — подтип типа string — это строки, не содержащие символов перевода строки ‘\n’ возврата каретки ‘\г’ и горизонтальной табуляции ‘\t’.

В строках типа token — подтипа типа normaiizedstring — нет, кроме того, начальных и завершающих пробелов и нескольких подряд идущих пробелов. В типе token выделены три подтипа. Подтип language определен для записи названия языка согласно рекомендации RFC 1766, например, ru, en, de, fr. Подтип NMTOKEN используется только в атрибутах для записи их перечисляемых значений. Подтип name составляют имена XML — последовательности букв, цифр, дефисов, точек, двоеточий, знаков подчеркивания, начинающиеся с буквы (кроме зарезервированной последовательности букв х, х, м, m, L, l в любом сочетании регистров) или знака подчеркивания. Мы видели в предыдущих главах, что имена, начинающиеся со стороки xml, используются самой спецификацией XML, например, имя атрибута xmlns. Двоеточие в значениях типа name применяется для выделения префикса в уточненных именах при использовании пространства имен.

Из типа name выделен подтип NCName (Non-Colonized Name) имен, не содержащих двоеточия, в котором, в свою очередь, определены три подтипа: ID, ENTITY, IDREF, — описывающие идентификаторы XML, примитивы и перекрестные ссылки на идентификаторы.

Дата и время

Тип duration описывает промежуток времени, например, запись P1Y2M3DT10H30M45S означает один год (IY), два месяца (2м), три дня (3D), десять часов (10н), тридцать минут (30м) и сорок пять секунд (45s). Запись может быть сокращенной, например, Р120М означает 120 месяцев, а Т120М — 120 минут.

Тип dateTime содержит дату и время в формате ccYY-MM-DDThh:mm:ss, например, 2003-04-25Т09:30:05. Остальные типы выделяют какую-либо часть даты или времени.

Тип time содержит время В обычном формате hh:imr.ss.

Тип date содержит дату в формате CCYY-MM-DD.

Тип gYearMonth выделяет год и месяц в формате CCYY-MM.

Тип gMonthDay содержит месяц и день месяца в формате -MM-DD.

Тип gYear означает год в формате CCYY, тип gMonth — месяц в формате -MM, тип gDay — день месяца в формате - DD.

Двоичные типы

Двоичные целые числа записываются либо в шестнадцатеричной форме без всяких дополнительных символов: 0B2F, 356С0А и т. д., это тип hexBinary, либо в кодировке Base64, это тип base64Binary.

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

В схемах XML с помощью встроенных типов можно тремя способами определить новые типы простых элементов. Они вводятся как сужение (restriction) встроенного или ранее определенного простого типа, список (list) или объединение (union) простых типов. Простой тип определяется компонентом схемы simpieType, имеющим вид

<xsd:simpleType name="имя типа">Определение типа</xsd:simpleType>

Сужение

Сужение простого типа определяется компонентом restriction, в котором атрибут base указывает сужаемый простой тип, а в содержимом задаются ограничения, выделяющие определяемый простой тип. Например, почтовый индекс zip можно определить, как шесть арабских цифр следующим образом:

<xsd: simpleType name="zip">

<xsd:restriction base="xsd:string">

<xsd:pattern value="[0-9]{6}" />

</xsd:restriction>

</xsd:simpleType>

Можно дать другое определение простого типа zip как целого положительного числа, находящегося в диапазоне от 100000 до 999999:

<xsd:simpleType name="zip">

<xsd:restriction base="xsd:positiveInteger">

<xsd:minInclusive value="100000" />

<xsd:maxInclusive value="999999" />

</xsd:restriction>

</xsd:simpleType>

Теги <pattern>, <maxInclusive> и др., задающие ограничения, называются фасетками (facets). Вот их список:

· <maxExclusive> — наибольшее значение, которое уже не входит в определяемый тип;

· <maxInclusive> — наибольшее значение определяемого типа;

· <minExclusive> — наименьшее значение, уже не входящее в определяемый тип;

· <minInclusive> — наименьшее значение определяемого типа;

· <totalDigits> — общее количество цифр в определяемом числовом типе — сужении типа decimal;

· <fractionDigits> — количество цифр в дробной части числа;

· <length> — длина значений определяемого типа;

· <maxLength> — наибольшая длина значений определяемого типа;

· <minLength> — наименьшая длина значений определяемого типа;

· <enumeration> — одно из перечислимых значений;

· <pattern> — регулярное выражение;

· <whitespace> — применяется при сужении типа string и определяет способ преобразования пробельных символов ‘\n’, ‘\r’, ‘\t’. Атрибутvalue этого тега принимает одно из трех значений:

· preserve — не убирать пробельные символы;

· replace — заменить пробельные символы пробелами;

· collapse — после замены пробельных символов пробелами убрать начальные и конечные пробелы, а из нескольких подряд идущих пробелов оставить только один.

В тегах-фасетках можно записывать следующие атрибуты, называемые базисными фасетками (fundamental facets):

· ordered — задает упорядоченность определяемого типа, принимает одно из трех значений:

· false — тип неупорядочен;

· partial — тип частично упорядочен;

· total — тип полностью упорядочен;

· bounded— задает ограниченность или неограниченность типа значением true или false;

· cardinality — задает конечность. или бесконечность типа значением finite или countably infinite;

· numeric — показывает, числовой этот тип или нет, значением true или false.

Как видно из приведенных выше и ниже примеров, в одном сужении может быть несколько ограничений-фасеток. При этом фасетки и задают независимые друг от друга ограничения, их можно мысленно объединить союзом "или". Остальные фасетки задают общие, совместно накладываемые ограничения, их можно мысленно объединить союзом "и".

Список

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

<days>21 34 55 46</days>

Список определяется компонентом list, в котором атрибутом itemType указывается тип элементов определяемого списка. Тип элементов списка можно определить и в содержимом элемента list. Например, показанный выше элемент документа XML days можно определить в схеме так:

<xsd:element name="days" type="listOfInteger" />

а использованный при его определении тип listOfInteger задать как список не более чем из пяти целых чисел следующим образом:

<xsd:simpleType name="listOfInteger">

<xsd:restriction>

<xsd:simpleType>

<xsd:list itemType="xsd:integer" />

</xsd:simpleType>

<xsd:maxLength value="5" />

</xsd:restriction>

</xsd:simpleType>

При определении списка можно применять фасетки <length>, <minLength>, <maxLength>, <enumeration>, <pattern>. В приведенном выше примере список — тело элемента days — не может содержать более пяти чисел.

Объединение

Простой тип-объединение определяется компонентом union, в котором атрибутом memberTypes можно указать имена объединяемых типов. Например:

<xsd:union memberTypes="xsd:string xsd:integer listOfInteger" />

Другой способ — записать в содержимом компонента union определения простых типов, входящих в объединение. Например:

<xsd:attribute name="size">

<xsd:simpleType>

<xsd:union>

<xsd:simpleType>

<xsd:restriction base="xsd:positivelnteger">

<xsd:minInclusive value="8"/>

<xsd:maxInclusive value="72"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType>

<xsd:restriction base="xsd:NMTOKEN">

<xsd:enumeration value="small"/>

<xsd:enumeration value="medium"/>

<xsd:enumeration value="large"/>

</xsd:restriction>

</xsd:simpleType>

</xsd:union>

</xsd:simpleType>

</xsd:attribute>

После этого атрибут size можно использовать, например, так:

<font size='large'>Глава l</font>

<font size='12'>Простой текст</font>

Определение типа элемента

</xsd:element>

Объявление атрибута элемента тоже несложно:

<xsd:attribute name=" имя атрибута" type="тип атрибута" use="обязательность атрибута" default="значение по умолчанию" />

Необязательный атрибут use может принимать одно из трёх значений:

· optional — описываемый атрибут необязателен (это значение по умолчанию);

· required — описываемый атрибут обязателен;

· prohibited — описываемый атрибут неприменим. Это значение полезно при определении подтипа, чтобы отменить некоторые атрибуты базового типа.

Например:

<xsd:attribute name="id" type="positiveInteger" use="required" />

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

<xsd:attribute name="name" type="NCName" default="anonymous" />

Определение типа атрибута, — а это должен быть простой тип, — можно вынести в содержимое элемента attribute.

<xsd:attribute name="имя атрибута">

Тип атрибута

</xsd:attribute>

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

Напомним, что тип элемента называется сложным, если в элемент вложены другие элементы и/или в открывающем теге элемента есть атрибуты. Сложный тип определяется компонентом complexType, имеющим вид:

<xsd:complexType name="имя типа" >

Определение типа

</xsd:complexType>

Необязательный атрибут name задает имя типа, а в содержимом компонента complexType описываются элементы, входящие в сложный тип, и/или атрибуты открывающего тега.

Определение сложного типа можно разделить на три группы:

· определение типа пустого элемента;

· определение типа элемента с простым телом;

· определение типа элемента, содержащего вложенные элементы.

Рассмотрим эти определения подробнее.

Модель группы all отличается в этом от моделей sequence и choice. В компоненте all не допускается использование компонентов sequence иchoice. Аналогично, в компонентах sequence и choice нельзя применять компонент all. Каждый элемент, входящий в группу модели all, может появиться не более одного раза, т. е. атрибут maxOccurs этого элемента может равняться только единице.

Встроенные простые типы. Определение простых типов

Встроенные простые типы

Для более точного описания схемы документа, учитывающего тип содержимого элемента, количество повторений вложенного элемента и другие подробности, в мае 2001 года консорциум W3C рекомендовал описывать структуру документов XML на новом языке описания схем XSD (XML Schema Definition Language). На этом языке записывается схема XML (XML Schema), описывающая конструкции, использованные в документе XML.

Язык XSD создан как реализация XML. Это значит, что схема XML сама записывается в виде документа XML. Ее элементы называют компонентами (components), чтобы отличить их от элементов описываемого документа XML. Корневой компонент схемы носит имя schema. Компоненты схемы описывают элементы XML и определяют различные типы элементов. Рекомендация схемы XML перечисляет 13 типов компонентов, но наиболее важны компоненты, определяющие простые и сложные типы элементов, сами элементы и их атрибуты.

Язык XSD различает простые и сложные элементы XML. Простыми (simple) элементами описываемого документа XML считаются элементы, не содержащие атрибутов и вложенных элементов. Соответственно, сложные (complex) элементы содержат атрибуты и/или вложенные элементы. Схема XML определяет простые типы — типы простых элементов, и сложные типы — типы сложных элементов. Язык описания схем содержит множество встроенных простых типов, перечисленных в следующем разделе.

Встроенные типы языка описания схем XSD позволяют записывать двоичные и десятичные целые числа, вещественные числа, дату и время, строки символов, логические значения, адреса URI. Рассмотрим их по порядку.

Вещественные числа

Вещественные числа в языке XSD разделены на три типа: decimal, float и double.

Тип decimal составляют вещественные числа, записанные с фиксированной точкой: 123.45, —0.1234567689345 и т. д. Фактически хранятся два целых числа. Одно число представляет мантиссу, другое — порядок вещественного числа. Спецификация языка XSD не ограничивает количество цифр в мантиссе, но требует, чтобы можно было записать не менее 18 цифр. При обработке документа средствами технологии Java этот тип легко реализуется, например, классом java.math.BigDecimal, входящим в стандарт Java API.

Типы float и double соответствуют стандарту IEEE754-85 и одноименным типам Java. Они записываются с фиксированной или с плавающей десятичной точкой. Например, 34.567, -45.67, 1е-5, 34.58е14.

Целые числа

Основной целый тип integer понимается как подтип типа decimal, содержащий числа с нулевым порядком. Это целые числа с любым количеством десятичных цифр: -34567, 123456789012345 и т. д. При использовании средств Java для обработки документа этот тип легко реализуется классом java.math.Biglnteger.

Типы long, int, short и byte полностью соответствуют одноименным типам Java. Они понимаются как подтипы типа integer, типы более коротких чисел считаются подтипами более длинных чисел, например, тип byte - это подтип типа short, оба они подтипы типа int и т. д.

Значения типа byte, как следует из его названия, занимают один байт и изменяются от -128 до 127. Тип short занимает два байта, его значения лежат в диапазоне от -32768 до +32767. Числа типа int хранятся в четырех байтах и меняются от -214748.3648 до +2147483647. Наконец, тип long располагается в восьми байтах, его значения от -9223372036854775808 до +9223372036854775807.

Типы nonPositiveInteger и negativeInteger - подтипы типа integer - составлены из неположительных и отрицательных чисел соответственно с любым количеством цифр.

Типы nonNegativeInteger и positiveInteger – подтипы типа integer — составлены из неотрицательных и положительных чисел соответственно с любым количеством цифр.

У типа nonNegativeInteger есть подтипы целых чисел без знака unsignedLong, unsignedInt, unsignedShort и unsignedByte.

Строки символов

Основной символьный тип string описывает произвольную строку символов Unicode. Его можно реализовать средствами Java, используя класс Java.lang.String.

Тип normalizedstring — подтип типа string — это строки, не содержащие символов перевода строки ‘\n’ возврата каретки ‘\г’ и горизонтальной табуляции ‘\t’.

В строках типа token — подтипа типа normaiizedstring — нет, кроме того, начальных и завершающих пробелов и нескольких подряд идущих пробелов. В типе token выделены три подтипа. Подтип language определен для записи названия языка согласно рекомендации RFC 1766, например, ru, en, de, fr. Подтип NMTOKEN используется только в атрибутах для записи их перечисляемых значений. Подтип name составляют имена XML — последовательности букв, цифр, дефисов, точек, двоеточий, знаков подчеркивания, начинающиеся с буквы (кроме зарезервированной последовательности букв х, х, м, m, L, l в любом сочетании регистров) или знака подчеркивания. Мы видели в предыдущих главах, что имена, начинающиеся со стороки xml, используются самой спецификацией XML, например, имя атрибута xmlns. Двоеточие в значениях типа name применяется для выделения префикса в уточненных именах при использовании пространства имен.

Из типа name выделен подтип NCName (Non-Colonized Name) имен, не содержащих двоеточия, в котором, в свою очередь, определены три подтипа: ID, ENTITY, IDREF, — описывающие идентификаторы XML, примитивы и перекрестные ссылки на идентификаторы.

Дата и время

Тип duration описывает промежуток времени, например, запись P1Y2M3DT10H30M45S означает один год (IY), два месяца (2м), три дня (3D), десять часов (10н), тридцать минут (30м) и сорок пять секунд (45s). Запись может быть сокращенной, например, Р120М означает 120 месяцев, а Т120М — 120 минут.

Тип dateTime содержит дату и время в формате ccYY-MM-DDThh:mm:ss, например, 2003-04-25Т09:30:05. Остальные типы выделяют какую-либо часть даты или времени.

Тип time содержит время В обычном формате hh:imr.ss.

Тип date содержит дату в формате CCYY-MM-DD.

Тип gYearMonth выделяет год и месяц в формате CCYY-MM.

Тип gMonthDay содержит месяц и день месяца в формате -MM-DD.

Тип gYear означает год в формате CCYY, тип gMonth — месяц в формате -MM, тип gDay — день месяца в формате - DD.

Двоичные типы

Двоичные целые числа записываются либо в шестнадцатеричной форме без всяких дополнительных символов: 0B2F, 356С0А и т. д., это тип hexBinary, либо в кодировке Base64, это тип base64Binary.

Наши рекомендации