
- •Лабораторная работа № 14 Язык xml (extensible Markup Language, расширяемый язык разметки)
- •Листинг 14.1. Пример xml - документа
- •Листинг 14.2. Пример xml-документа с атрибутами в открывающем теге
- •Пространство имен тегов
- •Строки символов
- •Дата и время
- •Объединение
- •Описание элементов и их атрибутов
- •Определение сложных типов
- •Определение типа пустого элемента
- •Определение типа элемента с простым телом
- •Определение типа вложенных элементов
- •Определение типа со сложным телом
- •Пространства имен языка xsd
- •Листинг 14.5. Схема документа xml с целевым пространством имен
- •Включение файлов схемы в другую схему
- •Связь документа xml со своей схемой
- •Другие языки описания схем
- •Инструкции по обработке
- •Анализ документа xml
Включение файлов схемы в другую схему
В создаваемую схему можно включить файлы, содержащие другие схемы. Для этого есть два элемента схемы: <include> и <import>. Например:
<xsd: include xsi :schemaLocation= "names.xsd" />
Включаемый файл задается атрибутом xsi:schemaLocation. В примере он использован для того, чтобы включить в создаваемую схему содержимое файла names.xsd. Файл должен содержать схему с описаниями и определениями из того же пространства имен, что и в создаваемой схеме, или без пространства имен, то есть в нем не использован атрибут targetNamespace.
Это удобно, если мы хотим добавить к создаваемой схеме определения схемы names.xsd или просто хотим разбить большую схему на два файла. Можно представить себе результат включения так, как будто содержимое файла names.xsd просто записано на месте элемента <include>.
Перед включением файла можно изменить некоторые определения, приведенные в нем. Для этого используется элемент <redefine>, например:
<xsd: redefine schemaLocation="names.xsd">
<xsd: simpleType name= "nameType">
<xsd:restriction base="xsd:string">
<xsd:maxLengt.h value="40"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:redefine>
Если же включаемый файл содержит имена из другого пространства имен, то надо воспользоваться элементом схемы <import>. Например, пусть файл A.xsd начинается со следующих определений:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/Xml.Schema" targetNamespace="http: //some. firm.com/someNames">,
а файл B.xsd начинается с определений
<?xrnl versicn="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://some. firm. com/anotherNames”>
Мы решили включить эти файлы в новый файл C.xsd. Это делается так:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://some.firm.com/yetAnotherNames"
xmlns:prl="http: //some. firm.com/someNames”
xmlns:pr2="http: //same. firm. com/anotherNames">
<xsd: import namespace=http://some.firm.com/someNames xsi:schemaLocation=”А.xsd” />
<xsd:import namespace="http://some.firm.com/anotherNames" xsi:schemaLocation="B.xsd” />
После этого в файле C.xsd можно использовать имена, определенные в файлах A.xsd и B.xsd, снабжая их префиксами prl и рг2 соответственно.
Элементы <include> и <import> следует располагать перед всеми определениями схемы.
Значение атрибута xsi:schemaLocation. — строка URI, поэтому файл с включаемой схемой может располагаться в любом месте Интернета.
Связь документа xml со своей схемой
Программе-анализатору, проверяющей соответствие документа XML его схеме, надо как-то указать файлы (один или несколько), содержащие схему документа. Это можно сделать разными способами. Во-первых, можно подать эти файлы на вход анализатора. Так делает, например, проверяющий анализатор XSV (XML Schema Validator) (ftp://ftp.cogsci.ed.ac.uk/pub/XSV/): $ xsv ntb.xml ntbl .xsd ntb2 .xsd
Во-вторых, можно задать файлы со схемой как свойство анализатора, устанавливаемое методом setProperty(), или значение переменной окружения анализатора. Так делает, например, проверяющий анализатор Xerces.
Эти способы удобны в тех случаях, когда документ в разных случаях нужно связать с разными схемами. Если же схема документа фиксирована, то ее удобнее указать прямо в документе XML. Это делается одним из двух способов.
1. Если элементы документа не принадлежат никакому пространству имен и записаны без префикса, то в корневом элементе документа записывается атрибут noNamespaceSchemaLocation, указывающий расположение файла со схемой в форме URI:
<notebook xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemabocation="ntb.xsd">
В этом случае в схеме не должно быть целевого пространства имен, то есть, не следует использовать атрибут targetNamespace.
2. Если же элементы документа относятся к некоторому пространству имен, то применяется атрибут schemaLocation, в котором через пробел перечисляются пространства имен и расположение файла со схемой, описывающей это пространство имен. Продолжая пример предыдущего раздела, можно написать:
<notbook xmlns="http://some. firm.com/2003/ntbNames"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instarce xsi:schemaLocation="http://some. firm.com/sameNames A.xsd
http://some.firm.com/anotherNames В. xsd"
xmlns: pr1="http://some. firm. com/someNames"
xmlns:pr2="http: //some. firm.com/anotherNames">
После этого в документе можно использовать имена, определенные в схемах A.xsd и B.xsd, снабжая их префиксами prl и рг2 соответственно.