Учебное пособие (1075724), страница 19
Текст из файла (страница 19)
Тогда вместо атрибута xmlns:q="http://www.ru/namespace-example"необходимо указывать атрибут xmlns="http://www.ru/namespace-example".<?xml version="1.0" encoding="Windows-1251"?><languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_qa_2.xsd" xmlns="http://www.ru/namespace-example"><language id="123"><name>HTML</name><year>01.01.1990</year><howold>15</howold></language></languages>С использованием атрибута form="qualified"можно явноуказыватьквалифицированность отдельных элементов и атрибутов в документе.Пример 3.21.Файл XML:174<?xml version="1.0" encoding="Windows-1251"?><q:languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_form.xsd" xmlns:q="http://www.ru/namespace-example"><language q:id="123"><q:name>HTML</q:name><year>01.01.1990</year><howold>15</howold></language></q:languages>Файл XSD:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:ns1="http://www.ru/namespace-example"targetNamespace="http://www.ru/namespace-example"elementFormDefault="unqualified"attributeFormDefault="unqualified"><!-- Определение типа --><xsd:simpleType name="howoldType"><xsd:restriction base="xsd:integer"><xsd:enumeration value='10'/><xsd:enumeration value='15'/><xsd:enumeration value='20'/></xsd:restriction></xsd:simpleType><xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string" form="qualified"/>Элемент name должен быть квалифицированным (должен быть явно указанпрефикс пространства имен).<xsd:element name="year" type="xsd:string"/>175<xsd:element name="howold" type="ns1:howoldType"/></xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"form="qualified"/>Атрибут id должен быть квалифицированным.</xsd:complexType><xsd:complexType name="languagesType"><xsd:sequence><xsd:element name="language" type="ns1:languageType"maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="languages" type="ns1:languagesType"/></xsd:schema>3.2.14 Создание XML-схем, состоящих из нескольких файловЭлемент xsd:include позволяет включать схему из внешнего файла.
В схемахдолжны использоваться одинаковые пространства имен.Пример 3.22.Файл XML:<?xml version="1.0" encoding="Windows-1251"?><languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="include.xsd"><language id="123"><name>HTML</name><year>01.01.1990</year><howold>15</howold></language></languages>Файл include.xsd:<?xml version="1.0" encoding="UTF-8"?>176<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:include schemaLocation="include_inner.xsd"/>Включение файла, содержащего часть XML-схемы.<xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="year" type="xsd:string"/><xsd:element name="howold" type="howoldType"/></xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType><xsd:complexType name="languagesType"><xsd:sequence><xsd:element name="language" type="languageType"maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="languages" type="languagesType"/></xsd:schema>Файл include_inner.xsd:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><!-- Перечисление вынесено в отдельную схему --><xsd:simpleType name="howoldType"><xsd:restriction base="xsd:integer"><xsd:enumeration value='10'/><xsd:enumeration value='15'/><xsd:enumeration value='20'/></xsd:restriction></xsd:simpleType></xsd:schema>177Импортированиесхемприменяетсяприиспользованиинесколькихпространств имен.Пример 3.23.Файл XML:<?xml version="1.0" encoding="Windows-1251"?><q:languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-example import.xsd"xmlns:q="http://www.ru/namespace-example" xmlns:ns2="www.ns2.ru"><language id="123"><name>HTML</name><year>01.01.1990</year><ns2:howold>15</ns2:howold></language></q:languages>Файл import.xsd:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.ru/namespace-example"xmlns:ns1="http://www.ru/namespace-example" xmlns:ns2="www.ns2.ru"elementFormDefault="unqualified" attributeFormDefault="unqualified"><xsd:import namespace="www.ns2.ru"schemaLocation="import_inner.xsd"/>Вставка внешней схемы, в которой используется другое пространство имен.<xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="year" type="xsd:string"/><xsd:element ref="ns2:howold"/>xsd:element ссылается на импортированное объявление элемента ns2:howold.178</xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType><xsd:complexType name="languagesType"><xsd:sequence><xsd:element name="language" type="ns1:languageType"maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="languages" type="ns1:languagesType"/></xsd:schema>Файл import_inner.xsd:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:ns2="www.ns2.ru" targetNamespace="www.ns2.ru"elementFormDefault="unqualified" attributeFormDefault="unqualified"><!-- Перечисление вынесено в отдельную схему --><xsd:simpleType name="howoldType"><xsd:restriction base="xsd:integer"><xsd:enumeration value='10'/><xsd:enumeration value='15'/><xsd:enumeration value='20'/></xsd:restriction></xsd:simpleType><xsd:element name="howold" type="ns2:howoldType"/></xsd:schema>С помощью элемента xsd:any в XML-документ можно вставлять любыеэлементы, принадлежащие определенному пространству имен.Пример 3.24.Файл XML:<?xml version="1.0" encoding="Windows-1251"?>179<languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="any.xsd"xmlns:ns1="http://www.ns1.ru"><language id="123"><name>HTML</name><year>01.01.1990</year><ns1:AnyElement><B>qwerty</B></ns1:AnyElement></language></languages>Файл XSD:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="year" type="xsd:string"/><xsd:any namespace="http://www.ns1.ru"processContents="skip" minOccurs="0" maxOccurs="unbounded"/>В этом месте последовательности могут следовать любые элементыпространства имен «http://www.ns1.ru».
Атрибут processContents="skip" указывает,что элементы, принадлежащие этому пространству имен, не нужно проверять надействительность.</xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType><xsd:complexType name="languagesType"><xsd:sequence>180<xsd:element name="language" type="languageType"maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="languages" type="languagesType"/></xsd:schema>3.2.15 Шаблоны проектирования схемТак как в XML-схемах существуют различные варианты совместногоиспользования составных типов и элементов, то появилось понятие «шаблон(паттерн) проектирования схем».Существует четыре наиболее распространенных шаблона проектированиясхем: Venetian Blind (венецианская штора). Russian Doll (матрешка). Salami Slice (ломтики салями). Garden of Eden (Райский Сад, идеальный шаблон).Некоторыесредстваразработки(вчастностиNetBeans)умеютпреобразовывать схемы из одного шаблона в другой.Рассмотрим шаблоны более подробно.В шаблоне Venetian Blind (венецианская штора) определен один глобальныйэлемент.
Остальные вложены в глобальный с использованием именованныхсоставных типов и групп. Составные типы и группы могут быть использованынесколько раз.То есть в схеме определены глобальные типы xsd:complexType иxsd:simpleType с атрибутом name. Определен единственный глобальный элементxsd:element, который ссылается на глобальные типы с помощью атрибута type.Данный шаблон является наиболее распространенным. Все предыдущиепримеры в этой главе (за исключением примера на ключи) разработаны именнопо этому шаблону.181Пример 3.25.Файл XSD:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><!-- Определение типа для атрибута --><xsd:simpleType name="howoldType"><xsd:restriction base="xsd:integer"><xsd:enumeration value='10'/><xsd:enumeration value='15'/><xsd:enumeration value='20'/></xsd:restriction></xsd:simpleType><xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="year" type="xsd:string"/><xsd:element name="howold" type="howoldType"/></xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType><xsd:element name="languages"><xsd:complexType><xsd:sequence><xsd:element name="language" type="languageType"maxOccurs="unbounded"/></xsd:sequence></xsd:complexType></xsd:element></xsd:schema>Форма преобразования шаблона в NetBeans:182Рис.
3.10. Преобразование XML-схемы в шаблон «венецианская штора».В шаблоне Russian Doll (матрешка) определен один глобальный элемент.Остальные вложены в глобальный с использованием неименованных составныхтипов. Составные типы могут быть использованы только один раз.Пример 3.26.Файл XSD:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><!-- Определение типа для атрибута --><xsd:element name="languages"><xsd:complexType><xsd:sequence><xsd:element name="language" maxOccurs="unbounded"><xsd:complexType><xsd:sequence><xsd:element name="name" type="xsd:string"/>183<xsd:element name="year" type="xsd:string"/><xsd:element name="howold"><xsd:simpleType><xsd:restriction base="xsd:integer"><xsd:enumeration value="10"/><xsd:enumeration value="15"/><xsd:enumeration value="20"/></xsd:restriction></xsd:simpleType></xsd:element></xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType></xsd:element></xsd:sequence></xsd:complexType></xsd:element></xsd:schema>Форма преобразования шаблона в NetBeans:Рис.














