Как создать схему xml файла

Обновлено: 06.07.2024

В этой главе будет показано, как писать XML схемы. Также вы узнаете, что схемы можно писать разными способами.

XML документ

Давайте посмотрим на следующий XML документ под названием "shiporder.xml":

Приведенный выше 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, который и определяет саму схему:

Теперь мы должны определить элемент 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.

Классы в пространстве имен System.Xml.Schema сопоставляются со структурами, определенными в рекомендациях по схемам XML консорциума W3C, и могут использоваться для сборки схем XML в памяти.

Построение схемы XML

В следующем примере кода для построения схемы XML в памяти используется API модели SOM.

Создание элемента и атрибутов

Примеры кода собирают пользовательскую схему снизу вверх, вначале создавая дочерние элементы, атрибуты и их соответствующие типы, а затем элементы верхнего уровня.

В следующем примере кода элементы FirstName и LastName , а также атрибут пользовательской схемы CustomerId создаются с помощью классов XmlSchemaElement и XmlSchemaAttribute модели SOM. Помимо свойств Name классов XmlSchemaElement и XmlSchemaAttribute, соответствующих атрибуту name элементов <xs:element /> и <xs:attribute /> схемы XML, все остальные атрибуты, разрешенные схемой ( defaultValue , fixedValue , form и так далее), имеют соответствующие свойства в классах XmlSchemaElement и XmlSchemaAttribute.

Создание типов схемы

Содержимое элементов и атрибутов определяется их типом. Чтобы создать элементы и атрибуты со встроенными типами схемы, свойство SchemaTypeName классов XmlSchemaElement или XmlSchemaAttribute принимает значение соответствующего полного имени встроенного типа с помощью класса XmlQualifiedName. Чтобы создать определяемый пользователем тип для элементов и атрибутов, формируется новый простой или сложный тип с помощью классов XmlSchemaSimpleType или XmlSchemaComplexType.

Чтобы создать неименованные простые или сложные типы, являющиеся анонимными потомками элемента или атрибута (к атрибутам применяются только простые типы), присвойте свойству SchemaType класса XmlSchemaElement или класса XmlSchemaAttribute значение неименованного простого или сложного типа, а не свойства SchemaTypeName классов XmlSchemaElement или XmlSchemaAttribute.

Схемы XML допускают, чтобы анонимные и именованные простые типы выводились по ограничению из других простых типов (встроенных или пользовательских) либо конструировались в виде списка или объединения других простых типов. Класс XmlSchemaSimpleTypeRestriction используется для создания простого типа, ограничивая встроенный тип xs:string . Чтобы создать тип списка или объединения, можно также использовать класс XmlSchemaSimpleTypeList или XmlSchemaSimpleTypeUnion. Свойство XmlSchemaSimpleType.Content обозначает, является ли оно простым типом ограничения, типом списка или объединением.

В следующем примере кода тип FirstName элемента является встроенным типом xs:string , тип LastName - именованным простым типом, представляющим собой ограничение встроенного типа xs:string со значением аспекта MaxLength , равным 20, а тип атрибута CustomerId является встроенным типом xs:positiveInteger . Элемент Customer представляет собой анонимный сложный тип, примитив которого является последовательностью элементов FirstName и LastName и атрибут которого содержит атрибут CustomerId .

Классы XmlSchemaChoice и XmlSchemaAll можно также использовать в качестве примитивов сложного типа для репликации семантики <xs:choice /> или <xs:all /> .

Создание и компиляция схем

В этой точке дочерние элементы и атрибуты, их соответствующие типы и элемент верхнего уровня Customer были созданы в памяти с помощью API модели SOM. В следующем примере кода с помощью класса XmlSchema создается элемент схемы, к нему добавляются элементы верхнего уровня и типы с помощью свойства XmlSchema.Items и полная схема компилируется с помощью класса XmlSchemaSet и выводится на консоль.

Все свойства результатов проверки компиляции схемы в API модели SOM отличаются от информационного набора окончательной проверки схемы.

Объект ValidationEventHandler, добавленный к набору XmlSchemaSet, является делегатом, вызывающим метод ответного вызова ValidationCallback для обработки ошибок и предупреждений проверки схемы.

Ниже приводится полный пример кода, а пользовательская схема выводится на консоль.

Создаём XML-файл

XML-формат предназначен для хранения данных, которые могут пригодиться в работе некоторых программ, сайтов и поддержки определённых языков разметки. Создать и открыть файл с таким форматом не сложно. Это вполне можно сделать, даже если на компьютере не установлено какое-либо специализированное программное обеспечение.

Немного об XML

Создавать XML-файлы можно как при помощи специализированных программ, так и встроенным в Windows текстовым редактором. От вида используемого ПО зависит удобство написания кода и уровень его функциональности.

Способ 1: Visual Studio

Создание документа в MS Visual Studio

Создание XML-файла в MS Visual Studio

В только что созданном файле уже будет первая строка с кодировкой и версией. По умолчанию прописана первая версия и кодировка UTF-8, которые вы можете поменять в любое время. Дальше для создания полноценного XML-файла вам нужно прописать всё то, что было в предыдущей инструкции.

Способ 2: Microsoft Excel

Можно создать XML-файл и не прописывая код, например, при помощи современных версий Microsoft Excel, который позволяет сохранять таблицы с данным расширением. Однако нужно понимать, что в этом случае создать что-то более функциональное обычной таблицы не получится.

Такой способ больше подойдёт тем, кто не хочет или не умеет работать с кодом. Однако в этом случае пользователь может столкнуться с определёнными проблемами при перезаписи файла в XML-формат. К сожалению, проделать операцию преобразования обычной таблицы в XML можно только на самых новых версиях MS Excel. Чтобы это сделать, используйте следующую пошаговую инструкцию:

Заполняем таблицу Excel

Сохранение таблицы

Выбор места сохранения

Способ 3: Блокнот

    Создайте обычный текстовый документ с расширением TXT. Разместить его можно где угодно. Откройте его.

Создание XML-файла

<?xml version="1.0" encoding="utf-8"?>

Задаём кодировку

Примерно так у вас должен выглядеть готовый результат:

Готовый документ

XML-компиляторы должны обработать этот код в виде таблицы с одной колонкой, где указаны данные о неком Иване Иванове.

Как видите в создании XML-файла нет ничего сложного. При желании его может создать любой пользователь, который более-менее умеет работать на компьютере. Однако для создания полноценного XML-файла рекомендуется изучить данный язык разметки, хотя бы на примитивном уровне.

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

Итак, что же мы будем делать, для того, что бы научиться штамповать XML на основе вашего эталона? Опишу всё по порядку.

Имеется:
Какой то XML (xmlfile.xml), сохраненный в текстовом формате в файл. Ниже приведу текст:

Шаг 1. Создание XSD из XML.

  1. Утилита xsd.exe - создатель Microsoft.
  2. Утилита xsd2code.exe - стороннее приложение, которое умеет все тоже самое, что и xsd.exe, но доступно для скачивания напрямую (на данный момент стала платной с Trial периодом).
  3. Использование любых онлайн сервисов.

- Далее перейдя в папку:
C:\Program Files (x86)\Microsoft SDKs\Windows>

- Воспользуемся поиском, и найдем файл xsd.exe, после чего (что бы упростить себе работу), скопируем его в созданную в корне диска папку C:\xmltoxsd. Далее в эту же папку мы копируем наш xmlfile.xml и все готово к началу.


Отрываем "Командную строку" (Пуск -> "Выполнить" -> "cmd"), переходим в наш каталог и вызываем с параметрами по умолчанию xsd.exe, передавая наш xmlfile.xml параметром:


И видим, что рядом появился файл xmlfile.xsd с содержимым.


Вот и все! Этих действий достаточно, для создания примитивного XSD файла, с которым можно работать. Но стоит понимать, что сам xsd.exe, как и любая другая утилита, ничего не знает про типы ваших полей (поэтому почти всегда тип полей будет string), а так же о всех вариациях атрибутов и параметров. То есть, если у какого-то тега нет атрибута в вашей XML, тогда его и не будет в описании. Поэтому XML должен быть наиболее полным и в случае, если элемент может содержать несколько дочерних полей, лучше добавить как минимум два, что бы xsd.exe понял, что это коллекция.

Синтаксис XSD не очень сложный, поэтому, если пишется достаточно серьезное описание, возможно придется поработать и напильником.

Шаг 2. Создание Class из XSD.


После выполнения появится файл xmlfile.cs, содержимое которого приведено ниже в сжатом виде:



Как видите, для внутреннего элемента catalog был создан класс catalogBook, у которого поля соответствуют полям в XML, а поле Id помечено как атрибут. Xsd.exe корректно понял, что внутри catalog хранится коллекция книг, поэтому появилось свойство Items, для наполнения дочерней коллекции.
Замечание: xsd.exe не умеет добавлять комментарии к получившимся классам и полям. В описании XSD существует элемент под названием < xs:annotation > , который чаще всего содержит < xs:documentation >, внутри которого размещено описание поля. По идее, оно должно быть размещено в /// описании, но на текущий момент xsd.exe отказывается добавлять текст в описание, поэтому приходится прибегать к альтернативам, таким как xsd2code или онлайн сервисам.

Шаг 3. Сериализация объектов в XML.

Получившиеся классы у нас лежат в файле xmlfile.cs. Далее его содержимое или сам файл добавляем в проект Visual Studio, после чего можно с ним работать. Я создам демонстративный объекты книг, после чего сохраню в файл в формате XML.

После запуска и открытия Output.xml можно увидеть, что мы сохранили так, как мы хотели (Нижний файл - "Созданный кодом").


Как мы видим, форматирование было соблюдено, а данные были наполнены нами.

XSD — это язык описания структуры XML документа. Его также называют XML Schema. При использовании XML Schema XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных.

Такой подход позволяет объектно-ориентированным языкам программирования легко создавать объекты в памяти, что, несомненно, удобнее, чем разбирать XML как обычный текстовый файл.

Кроме того, XSD расширяем, и позволяет подключать уже готовые словари для описания типовых задач, например веб-сервисов, таких как SOAP.

Стоит также упомянуть о том, что в XSD есть встроенные средства документирования, что позволяет создавать самодостаточные документы, не требующие дополнительного описания.

Рассмотрим в качестве примера XSD документ, описывающий часть структуры аккаунта на хабре.


Текст XSD схемы и XML документ, соответствующий этой схеме я не стал включать в статью из-за их размера.

Первая строчка схемы указывает, что документ является XML документом и использует кодировку UTF-8.

Со следующей строки начинается описания главного элемента документа — habra_user.
< xs:annotation >
< xs:documentation > Главный элемент схемы. Описывает пользователя хабра </ xs:documentation >
</ xs:annotation >

Тег <xs:complexType> описывает «сложный» тип данных user_name. При желании его можно вынести как отдельный тип данных, по аналогии с contact_info. Для этого, нужно блок <xs:complexType> перенести в <xs:schema> и указать атрибут name, а элементу задать атрибут type.

Элементы user_name, first_name, last_name имеют строковый тип и описывают пользователя, имя и фамилию владельца аккаунта.

Элемент date_of_birth имеет тип данных «дата» и описывает дату рождения.

Дату регистрации описывает register_date, имеющий собственный тип данных customDateTime. Значение этого тега будет задаваться с помощью атрибута value. На это указывают строки.

При этом атрибут — обязательный. Чтобы значение соответствовало требованиям, опишем «проверки»:
< xs:simpleType >
< xs:restriction base ="xs:string" >
< xs:length value ="19" />

< xs:pattern value ="2486-15-31 17:57:42" />

</ xs:restriction >
</ xs:simpleType >

В таком случае длина строки будет всегда 19, это задано тегом <xs:length> и само значение будет соответствовать шаблону, указанным в теге <xs:pattern>.

Элементы contact_info и blog — массивы, на это указывает атрибут maxOccurs=«unbounded».

Тег <xs:choice> определяет то, что вложенным элементом будет один из элементов ICQ или linkedin.

Тег <xs:sequence> указывает на то, что вложенные элементы будут blog_name и blog_url именно в такой последовательности. Если последовательность не важна, то нужно использовать тег <xs:all>.

Дополнительно о XSD схемах можно почитать Wikipedia и W3C. Для создания макета была использована программа Altova XMLSpy.

Читайте также: