Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_XML.doc
Скачиваний:
16
Добавлен:
03.05.2019
Размер:
3.94 Mб
Скачать

9.6. Безымянные типы

Все описанные в листинге 1.45 типы используются только один раз. Поэтому необязательно давать типу имя. Схема XML, как говорилось выше, позволяет определять безымянные типы. Такое определение дается внутри описания элемента. Именно так в листинге 1.45 описаны атрибуты элемента name. В листинге 1.46 показано упрощенное описание схемы адресной книги.

<?xml version="1.0"?>

<!-- Имя файла: AdressBook02.xsd -->

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="notebook">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="person" type="personType" maxOсcurs="unbounded" />

<xsd:complexType>

<xsd:sequence>

<xsd:element name="name">

<xsd:complexType>

<xsd:attribute name="first" type="xsd:string"

use="optional" />

<xsd:attribute name="second" type="xsd:string"

use="optional" />

<xsd:attribute name="surname" type="xsd:string"

use="required" />

</xsd:complexType>

</xsd:element>

<xsd:element name="birthday">

<xsd:simpleType>

<xsd restriction base="xsd:string">

<xsd:pattern value="[0-9]{2}.[0-9]{2}.[0-9]{4}">

</xsd restriction>

</xsd:simpleType>

</xsd:element>

<xsd:element name="address" maxOccurs="unbounded">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="street" type="xsd:string" />

<xsd:element name="city">

<xsd:complexType>

<xsd:simpleContent>

<xsd:extension base='xsd:string' >

<xsd: attribute name='type' type='xsd:string'

use='optional' default='город' />

</xsd:extension>

</xsd:simpleContent>

</xsd:complexType>

</xsd:element>

<xsd:element name="zip" type="xsd:positiveInteger" />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd: element name="phone-listType">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="work-phone" type="xsd:string"

minOccurs="0" maxOccurs="unbounded" />

<xsd:element name="home-phone" type="xsd:string"

minOccurs="0" maxOccurs="unbounded" />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

Листинг 1.46

Еще одно упрощение можно сделать, используя пространство имен по умолчанию.

9.7. Пространства имён языка xsd

Имена элементов и атрибутов, используемые при записи схем, определены в пространстве имен с идентификатором http://www.w3.org/2001/XMLSchema. Префикс имен, относящихся к этому пространству, часто называют xs или xsd, как в листингах 1.45 и 1.46. Каждый анализатор "знает" это пространство имен и "понимает" имена из этого пространства.

Можно сделать это пространство имен пространством по умолчанию, но тогда надо задать пространство имен для определяемых в схеме типов и элементов. Для удобства такого определения введено понятие целевого пространства имен (target namespace). Идентификатор целевого пространства имен определяется атрибутом targetNamespace, например:

<xsd:schema targetNamespace="http://some.firm.com/2003/ntbNames">

После такого определения имена, определяемые в этой схеме, будут относиться к новому пространству имен с идентификатором http://some.firm.com /2003/ntbNames. Так сделано в листинге 1.47. Для упрощения записи в нем стандартное пространство имен схемы XML с идентификатором http://www.w3.org/2001/XMLSchema сделано пространством имен по умолчанию. Имена, относящиеся к целевому пространству, снабжены префиксом ntb, чтобы они не попали в пространство имен по умолчанию.

<?xml version="1.0"?>

<!-- Имя файла: AdressBook03.xsd -->

<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://some.firm.com/2003/ntbNames"

xmlns:ntb="http://some.firm.com/2003/ntbNames"

<element name="ntb:notebook">

<complexType>

<sequence>

<xsd:element name="person" maxOсcurs="unbounded" />

<complexType>

<sequence>

<element name="name">

<complexType>

<attribute name="first" type="string"

use="optional" />

<attribute name="second" type="string"

use="optional" />

<attribute name="surname" type="string"

use="required" />

</complexType>

</element>

<element name="birthday">

<simpleType>

<restriction base="string">

<pattern value="[0-9]{2}.[0-9]{2}.[0-9]{4}">

</restriction>

</simpleType>

</element>

<element name="address" maxOccurs="unbounded">

<complexType>

<sequence>

<element name="street" type="string" />

<element name="city" type="string" />

<element name="zip" type="positiveInteger" />

</sequence>

</complexType>

</element>

<element name="phone-listType">

<complexType>

<sequence>

<element name="work-phone" type="string"

minOccurs="0" maxOccurs="unbounded" />

<element name="home-phone" type="string"

minOccurs="0" maxOccurs="unbounded" />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

Листинг 1.47

Поскольку в листинге 1.47 пространством имен по умолчанию сделано пространство http://www.w3.org/2001/XMLSchema, префикс xsd не нужен. Следует заметить, что в целевое пространство имен попадают только глобальные имена, чьи описания непосредственно вложены в корневой элемент schema. Это естественно, потому что только глобальными именами можно воспользоваться далее в этой или другой схеме. В листинге 1.47 лишь одно глобальное имя notebook. Вложенные имена name, address и др. только ассоциированы с глобальными именами.

В схемах и документах XML часто применяется еще одно стандартное пространство имен. Рекомендация языка XSD определяет несколько атрибутов: type, nil, schemaLocation, noNamespaceSchemaLocation, которые применяются не только в схемах, а и непосредственно в описываемых этими схемами документах XML, называемых экземплярами схем (XML schema instance). Имена этих атрибутов относятся к пространству имен http://www.w3.org/2001/XMLSchema-instance. Этому пространству имен чаще всего приписывают префикс xsi, например:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">