Элемент complexType определяет сложный тип. Элемент сложного типа может содержать другие элементы и/или атрибуты.
Синтаксис элемента
Атрибуты элемента
Атрибут
Описание
id
Не обязательный. Определяет уникальный идентификатор для элемента
name
Не обязательный. Определяет имя элемента
abstract
Не обязательный. Определяет, можно ли использовать этот сложный тип в документе. Значение true определяет, что элемент не может использовать данный сложный тип напрямую, а должен сначала определить новый сложный тип, производный от него. Значение по умолчанию false
mixed
Не обязательный. Определяет, могут ли символьные данные появляться между дочерних элементов данного элемента complexType. Значение по умолчнию false. Если дочерним является элемент simpleContent, то атрибут mixed использовать нельзя!
block
Не обязательный. Препятствует использованию сложного типа, который имеет заданный тип наследования, вместо данного сложного типа. Может принимать значение #all или список из расширений/ограничений:
Не обязательный. Запрещает указанный метод наследования сложного типа. Может принимать значение #all или список из расширений/ограничений:
Пример использования
Пример №1 В следующем примере декларируется элемент «note» сложного типа:
Пример №2 В следующем примере декларируется сложный тип «fullpersoninfo», производный от другого сложного типа «personinfo» путем расширения наследуемого типа тремя дополнительными элементами (address, city и country):
В этом примере элемент «employee» должен содержать последовательно следующие элементы: «firstname», «lastname», «address», «city» и «country».
компонент может иметь атрибут xml: lang, в котором указывается язык написания самой аннотации.
разработки, таблицы стилей и других приложений. Например, в середине компонента appInfo можно представить информацию о том, какие фасетки могут быть применены к каждому простого типа.
Типы данных
Объявление элемента
Обратите также внимание на то, что при указании типа элемента обязательно необходимо задавать пространство имен:
Объявление атрибутов
Необязательный атрибут use может принимать одно из следующих значений:
Простые и комплексные типы данных
simpleType
Простые типы в основном используются для сужение типов (restriction)
Cужение типов (restriction)
С помощью сужение типов (restriction) Мы можем контролировать любой тип данных на наличие его значения то есть ограничивать его значения Приме: Схема
Название фасетки
Описание
Наибольшее значение, которое больше не входит в определяем тип
Наибольшее значение определяемого типа
Наименьшее значение, которое больше не входит в Определяемый тип
Наименьшее значение определяемого типа
Общее количество цифр в определяемого числовом типе; сужение типа decimal
Количество цифр в дробной части числа
Длина значений определяемого типа
Наибольшая длина значений определяемого типа
Наименьшее длина значений определяемого типа
Одно из перечисленных значений
В тегах-фасетка также могут иметь атрибуты. Эти атрибуты называют базисными фасетками (fundamental facets). Среди них выделяют:
complexType
Схема: базовый элемент
Группы элементов
Группа позволяет описать общие элементы. (работает как include) Схема:
Defines a complex type, which determines the set of attributes and the content of an element.
Attributes
abstract An indicator of whether the complex type can be used in an instance document. If this value is true, an element cannot use this complex type directly but must use a complex type derived from this complex type. The default is false.
block The type of derivation. The block attribute prevents a complex type that has the specified type of derivation from being used in place of this complex type. This value can contain #all or a list that is a subset of extension or restriction. The block attribute is only used when, during validation, an instance document overrides the normal type for an element by using the schema-instance:type attribute. The block attribute is capable of stopping elements from selecting complex types that are defined through extension and/or restriction to replace the original type that is specified for the element.
extension
Prevents complex types derived by extension from being used in place of this complex type.
restriction
Prevents complex types derived by restriction from being used in place of this complex type.
Prevents all derived complex types from being used in place of this complex type.
final The type of derivation. The final attribute prevents the specified type of derivation of this complexType element. This value can contain #all or a list that is a subset of extension or restriction.
extension
Prevents derivation by extension.
restriction
Prevents derivation by restriction.
Prevents all derivation (both extension and restriction).
id The ID of this element. The id value must be of type ID and be unique within the document containing this element.
mixed An indicator of whether character data is allowed to appear between the child elements of this complex type. The default is false.
If simpleContent element is a child element, the mixed attribute is not allowed.
If complexContent element is a child element, this mixed attribute can be overridden by the mixed attribute on the complexContent element.
name The name of the type. The name must be a no-colon-name (NCName) as defined in the XML Namespaces specification.
Required if the containing element is the schema element; otherwise, prohibited.
If specified, the name must be unique among all simpleType and complexType elements.
Element Information
Number of occurrences
Unlimited within schema; one time within element.
Parent elements
Content
Remarks
A complex type is essentially a type definition for elements that may contain attributes and elements. An element can be declared with a type attribute that refers to a complexType element that defines the structure, content, and attributes of that element. (An element can also take a reference to a simpleType in its type attribute.)
A complex type can contain one and only one of the following elements, which determines the type of content allowed in the complex type.
Element
Description
simpleContent
The complex type has character data or a simpleType as content and contains no elements, but may contain attributes.
complexContent
The complex type contains only elements or no element content (empty).
group
The complex type contains the elements defined in the referenced group.
sequence
The complex type contains the elements defined in the specified sequence.
choice
The complex type allows one of the elements specified in the choice element.
The complex type allows any or all of the elements specified in the all element to appear once.
If group, sequence, choice, or all is specified as the child element, the attributes for the complexType can be declared optionally using the following elements.
Element
Description
attribute
The complex type contains the specified attribute.
attributeGroup
The complex type contains the attributes defined in the referenced attributeGroup.
anyAttribute
The complex type can contain any attribute from the specified namespace(s).
Any number of attribute or attributeGroup elements can be used. One instance of anyAttribute can also be used.
If group, sequence, choice, or all is specified, the elements must appear in the following order.
group | sequence | choice | all
attribute | attributeGroup
anyAttribute
Examples
The following example shows a complex type that contains a simple type (decimal) with an attribute and element declaration that uses a complex type.
The following example shows an instance of the myShoeSize element within an XML document.
The following example shows the myShoeSize element with the complexType defined anonymously within the element. (Note the absence of the name attribute.)
Консорциум W3C выработал рекомендацию языка определения схем XML (XSD), объединив наиболее популярные языки описания схем в один стандарт. Основная цель, которая при этом преследовалась, — получение стандарта, который можно широко реализовать и при этом он платформно-независимый.
Язык XML Schema Definition Language, который также называют XML Schema Language, во многом похож на язык XDR, с которым вы познакомились раньше. Схемы XSD способны решать следующие задачи:
XML-документ, который проверяется с помощью схемы, также должен содержать объявление пространства имен. Пространство имен всегда указывается в корневом элементе экземпляра документа с помощью атрибута
Ссылка на конкретную схему приводится в атрибуте
Объявление элемента и атрибута XSD
Основное объявление элемента состоит из имени и типа данных
В схемах XSD дескрипторы, используемые в документах XML, разделяются на две категории — сложные типы и простые типы. Элементы сложных типов могут содержать другие элементы, а также обладают определенными атрибутами; элементы простых типов такими возможностями не обладают.
Простые типы данных
Есть две главных категории простых типов:
Следующая таблица представляет список примитивных типов данных XML-схемы, аспекты, которые могут быть применены к типу данных и описания типа данных.
Следующая таблица представляет список производных типов данных XML-схемы, аспекты, которые могут быть применены к типу данных и описания типа данных.
Определённые пользователем простые типы
Получены из встроенных типов, применением к ним именованых ограничений, называемыми аспектами(Facets). Аспекты ограничивают допустимые значения простых типов. Синтаксис применения аспектов ограничения следующий:
Именованный тип данных
далее в контексте определения элемента сложного типа мы делаем ограничение на применение атрибутов этой группы:
Сложные типы данных
Модель содержания может ограничивать документ до некоторого набора элементных типов и атрибутов, описывать и поддерживать связи между этими различными компонентами и уникально обозначать отдельные элементы. Свободное использование модели содержания позволяет разработчикам изменять структурную информацию.
Перечень объявлений дочерних элементов приводится в структуре группирующих XSD-элементов choice, sequence, и all.
Элемент позволяет только одному из элементов, содержащихся в группе присутствовать в составе элемента. Элемент требует появления элементов группы в точно установленной последовательности в составе элемента. элемент позволяет элементам в группе быть (или не быть) в любом порядке в составе элемента.
Определение элемента сложного типа
Листинг 1. Пример XSD-схемы «Картотека.xsd»
Задание на лабораторную работу
Необходимо для XML документа, созданого в первой лабораторной работе, определить его струткуру с помощью XSD. Осуществить проверку соответсвия документа описанию его структуры.
W3C парсеры для XML.
XSD является стандартом, поддерживаемым и развиваемым консорциумом W3C. В рамках этой поддержкиThe Apache Software Foundation создала набор ПО, представляющего собой парсеры и другое обеспечение для работы с XML. Одним из таких известных парсеров является Xerces. Он существует в виде отдельного ПО, реализованного на С++ или Java. Чтобы не ограничивать Вас в выборе инструментальной среды и ОС, будем использовать Java реализацию ввиду ее кроссплатформенности и простоты использования.
Замечание. Для запуска Java приложения необходимо, чтобы на компьютере была установлена Java машина от Sun. Желательно с Java SDK.
Предположим у нас есть XML документ SONNET.XML
И есть соответсвенно схема SONNET.XSD
Готовый DomValidator для проверки правильности XML документа на Java можно скачать здесь.
Скомпилировать DOMValidator можно коммандой:
Проверить правильность SONNET.XML относительно схемы SONNET.XSD (должна находится в том же каталоге) можно коммандой
java DomValidator sonnet.xml xsd
И при необходимости сам Xerces можно скачать отсюда или с официального сайта.
1С магия XDTO-пакетов на примере интеграций с ГИС ЖКХ
Есть очень много статей о том, как работать с XSL/XSD из 1С, но все они в стиле: возьмем нашу XSD схему (простую и удбоную) или наш web-сервис и смотрите, как все легко экспортировать или импортировать. А что делать, если нам дали пачку XSD-схем со сложным взаимосвязями и изменять мы них не можем, а работать и поддерживать актуальность схем надо?
Сразу скажу, вопросы шифрования/подписи по ГОСТУ при работе с ГИС ЖКХ за рамками этой статьи и на хабре уже освещались. Хотя без подписей запросы выполнить не удастся.
Начнем с простого — скачаем пакет форматов по интеграционному взаимодействию с ГИС ЖКХ, импортируем все xsd схемы из пакета интеграций, наведем порядок переименуем все как нам удобно. В итоге получим как показано на картинке:
Ну а теперь приступим к магии. Попробуем запросить данные из справочника организаций по ОРГН. Это подсистема organizations-registry-common метод exportOrgRegist.
В hcs-organizations-registry-common-service.wsdl указано:
Ну приступим, откроем нужные нам пакеты XDTO. Оказывается, нужные сущности являются не типами, а свойствами, как с этим работать в документации на XDTO в статьях, которые я находил, не описано, поэтому воспользуемся урокам магии:
Начнем с тела exportOrgRegistryRequest.
Напишем функцию для сбора XML-запроса:
В итоге получим запрос:
Ответ от серверов ГИС ЖКХ (СИТ-1):
Как мы видим, ответ напрямую десериализовать не получится, потому что нет такого типа в предложенных xsd схемах. Нам надо как-то пропустить часть тэгов и обработать только область ответа. На эту тему я тоже не нашел информации, но методом проб и ошибок приходим к кусочку магий:
В итоге работать можно с очень сложными xsd схемами через стандартные инструменты платформы. В целом 1С контролируют типизацию и заполнения, бывает чересчур излишне, особенно когда внутри свойства пакета используется базовый тип другого пакета, но в любом случае тип нужно привести к локальному из-за другого пространства URI. Удобно работать с десериализоваными данными, так как там всю работу на себя берет платформа. Но проверки происходят на этапе выполнения, а при написания кода платформа 1С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.