Создание XML-документа на основе схемы XSD
Функция Создание образца XML создает образец XML-файла на основании файла XML-схемы (XSD).
Этот пункт можно использовать в следующих случаях.
- Чтобы понять, как использовать различные конструкции в данной схеме.
- Чтобы убедиться в том, что схема функционирует должным образом.
Функция Создание образца XML доступна только для глобальных элементов и требует, чтобы набор схем XML был допустимым.
С помощью этой функции обычно создаются допустимые XML-документы. Однако, если схема содержит одно или несколько из следующих ограничений, образец может быть недопустимым.
- Ограничения удостоверения xs:key , xs:keyref и xs:unique .
- Аспекты xs:pattern .
- Перечисления типа xs:QName .
- Типы xs:ENTITY , xs:ENTITIES и xs:NOTATION .
Также заметьте, что содержимое xs:base64Binary будет создано, только если в схеме есть перечисления для этого типа.
Создание экземпляра XML-документа на основе XSD-файла.
- Выполните действия, описанные в разделе «Практическое руководство. Создание и изменение файла схемы XSD».
- В обозревателе схемы XML щелкните правой кнопкой мыши глобальный элемент PurchaseOrder , а затем выберите пункт Создать образец XML. Если выбран данный параметр, файл PurchaseOrder.xml со следующим образцом XML-содержимого будет создан и открыт в редакторе XML:
name1 street1 city1 state1 1 name2 street2 city2 state2 -79228162514264337593543950335 name1 street1 city1 state1 1
Создание и изменение файла схемы XSD
Данный раздел описывает процесс создания нового файла XML-схемы (XSD) и добавления содержимого в XSD-файл.
Создание нового файла XML-схемы
- В Visual Studio откройте меню Файл и последовательно выберите пункты Создать>Файл. Или используйте клавиши CTRL+N.
- В диалоговом окне Создать файл выберите пункт Схема XML и нажмите кнопку Открыть. Будет создан новый файл. В Visual Studio откроется начальное представление и пустое окно Обозреватель схемы XML.
Редактирование файла
- Щелкните ссылку Используйте редактор XML для просмотра и изменения файла схемы XML в начальном представлении. Откроется редактор XML с новым файлом.
- Скопируйте пример кода XML-схемы из Схемы заказа на покупку и вставьте его вместо кода, добавленного в новый XSD-файл по умолчанию. Обозреватель схемы XML будет обновлен новым набором схем.
Пример XML схемы
В этой главе будет показано, как писать XML схемы. Также вы узнаете, что схемы можно писать разными способами.
XML документ
Давайте посмотрим на следующий XML документ под названием «shiporder.xml»:
John Smith Ola Nordmann Langgt 23 4000 Stavanger Norway Empire Burlesque Special Edition 1 10.90 Hide your heart 1 9.90
Приведенный выше XML документ состоит из корневого элемента shiporder с обязательным атрибутом orderid. Элемент shiporder содержит три дочерних элемента: orderperson, shipto и item. Элемент item используется дважды и содержит элемент title, необязательный элемент note, а также элементы quantity и price.
Строка xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» говорит XML парсеру, что этот документ должен быть проверен на соответствие схеме. Строка xsi:noNamespaceSchemaLocation=»shiporder.xsd» указывает, где именно находится схема (в данном случае она находится в той же папке, что и файл «shiporder.xml»).
Создание XML схемы
Теперь для приведенного выше XML документа создадим XML схему.
Создадим новый файл, который назовем «shiporder.xsd». Для создания XML схемы будем просто следовать за структурой XML документа и определять каждый встреченный элемент. Начнем со стандартной XML декларации, за которой опишем элемент xs:schema, который и определяет саму схему:
Здесь мы используем стандартное пространство имен (xs) и URI, ассоциированный с этим пространством имен, который имеет стандартное значение http://www.w3.org/2001/XMLSchema.
Теперь мы должны определить элемент shiporder. У этого элемента есть атрибут, и он содержит другие элементы, поэтому мы рассматриваем его как элемент составного типа. Определения дочерних элементов элемента shiporder поместим в декларацию xs:sequence, что задает жесткую последовательность подэлементов:
Теперь определим элемент orderperson, который будет простого типа (так как он не содержит ни атрибуты, ни другие элементы). Его тип (xs:string) имеет префикс пространства имен, ассоциированного с XML схемой, что указывает на использование предопределенного типа данных:
Теперь нам нужно определить два элемента составного типа: shipto и item. Начнем с определения элемента shipto:
При помощи схем мы можем определить число возможных вхождений любого элемента. В этом нам помогут атрибуты maxOccurs и minOccurs. Атрибут maxOccurs задает максимальное число вхождений элемента, а атрибут minOccurs задает минимальное число вхождений. По умолчанию значение обоих атрибутов равно 1.
Теперь определим элемент item. Этот элемент может использоваться неограниченное число раз внутри элемента shiporder. Определить такую особенность элемента item позволяет присваивание атрибуту maxOccurs значения «unbounded». Это означает, что элемент item может использоваться столько раз, сколько нужно автору документа. Обратите внимание, что элемент note опционален. Определим это установив атрибут minOccurs в нулевое значение:
Теперь мы можем декларировать атрибут элемента shiporder. Поскольку это обязательный атрибут, используем определение use=»required».
Примечание: Атрибуты должны всегда декларироваться последними:
Вот полный код файла схемы «shiporder.xsd»:
Разделение схемы
Предыдущий способ компоновки схемы весьма прост, однако, когда документ достаточно сложен, при подобном способе соответствующая схема может оказаться довольно громоздкой, что сильно скажется на удобстве ее чтения и поддержки.
Следующий способ компоновки схемы заключается в том, что сначала определяются все элементы и атрибуты, а затем на эти определения создаются ссылки при помощи атрибута ref.
Ниже приводится новая компоновка файла схемы («shiporder.xsd»):
Использование поименованых типов
Третий способ компоновки схемы предполагает определение классов или типов, которые позволяют повторное использование определений элементов. Это становится возможным, если дать имена элементам simpleTypes и complexTypes, а затем указать на них при помощи атрибута type.
Третий способ компоновки файла схемы («shiporder.xsd»):
Элемент restriction указывает на то, что тип данных является производным от типов данных из пространства имен W3C XML Schema. Таким образом, следующий фрагмент кода означает, что значение элемента или атрибута должно быть строковым:
Однако гораздо чаще элемент restriction используется для накладывания ограничений на элементы. Посмотрите на следующие строки из приведенной выше схемы:
Этот фрагмент кода указывает, что значение элемента или атрибута должно быть строковым, ровно шесть символов в длину, и этими символами должны быть цифры от 0 до 9.
Как подготовить инструментарий для создания xsd-схем
При отладке взаимодействия ИС УВ со СМЭВ возникает потребность в проверке соответствия запросов ИС УВ схемам ВС. Создание схем возможно в любом текстовом редакторе. Такой подход требует заметных затрат времени и может служить источником ошибок. Использование специализированных программных инструментов значительно сокращает трудозатраты на формирование комплекта файлов для регистрации нового ВС.
Рассмотрим возможности применения XML-инструментов для создания ВС для СМЭВ на примере продукта XMLSpy.
Примечание: Использование продукта ALTOVA XMLSpy требует приобретения лицензии.
Создание схемы

Для создания XSD-схемы выберите New в меню File, а затем выберите формат XML Schema v1.0:
Откроется стартовая форма документа — список элементов и типов схемы. Для новой схемы предлагается создать корневой элемент:

Создадим два корневых элемента – request и response. Для этого введем наименование и комментарий к существующей записи списка и добавим еще один корневой элемент.
Для добавления нового элемента или типа в список воспользуйтесь кнопкой Append (или Insert) и выберите тип добавляемого объекта:

Для просмотра древовидной структуры элемента воспользуйтесь кнопкой слева от записи списка:

- applicant с описанием атрибутов физического лица – заявителя
- application с описанием атрибутов заявления
Добавление элементов на схему осуществляется по правой кнопке мыши:

Сначала добавим Sequence, а затем наши элементы:

Аннотации к элементам можно создавать на графе, воспользовавшись командой Edit Annotation in Diagram из меню, вызываемого по правой кнопке мыши.
Приведем схему к следующему виду:

Атрибуты физического лица могут потребоваться в разных разделах схемы, поэтому для них лучше создать отдельный комплексный тип данных, который можно присваивать разным элементам запроса. Для этого нажмите правой кнопкой на элемент applicant и выберите команду «Make Global -> ComplexType»:

Будет создан новый комплексный тип данных с именем, состоящим из названия элемента и слова Type:

Переименуйте applicantType в PersonType и присвойте новый тип элементу applicationSubject:

Практически все операции создания схемы вида сведений можно выполнять на диаграмме схемы.
Ручное редактирование текста схемы также доступно:

Генерация XML-файла по схеме
Другой полезной при разработке вида сведений функцией является генерация XML-файла по схеме. Она может быть использована для подготовки эталонных запроса или ответа.
В меню «DTD/Schema» выполните команду «Generate Sample XML/JSON File…»:

Откроется форма с параметрами генерации. Выберите корневой элемент схемы, для которого будет создан XML-файл:

Будет сформирован следующий файл:

Поскольку в параметрах генерации не выбрана опция «Generate non-mandatory elements», то необязательный элемент patronymic не был включен в XML-файл ни для applicant, ни для applicationSubject.
Проверка XML-файла на соответствие схеме
На несоответствующий схеме запрос СМЭВ отвечает сообщение «Бизнес-данные сообщения не соответствуют схеме, зарегистрированной в СМЭВ» с подобным описанием ошибок:

Избежать получения подобных ошибок можно предварительно проверив корректность формируемых для отправки в СМЭВ сообщений. Для этого откройте файл запроса и в меню DTD/Schema воспользуйтесь командой Assign Schema, после чего выберите нужную схему (в примере это вид сведений ГИС ГМП «Прием необходимой для уплаты информации (начисления)»):

В XML-файл с запросом будет добавлена конструкция xsi:schemaLocation и в редакторе XML будут подсвечены все несоответствия запроса указанной схеме:

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