Как сделать xsd схему на основе xml файла
Схемы данных 1 Точный перевод XML Schema Document - < схема документа XML >, однако мы будем в дальнейшем использовать термин "схема данных XML". XSD ( XML Schema Document, XSD) представляют собой альтернативный способ правил построения XML-документов. По сравнению с DTD, схемы обладают более мощными средствами для определения сложных структур данных, обеспечивают более понятный способ описания грамматики языка, способны легко модернизироваться и расширяться. Схема XSD может содержать следующую информацию:
- представление связей между элементами данных, аналогичное связям внешних ключей между таблицами в реляционной базе данных;
- представление уникальных идентификаторов, подобных первичному ключу;
- спецификацию типов данных каждого индивидуального элемента и атрибута в XML-документе.
Для создания схемы данных в Visual Studio .NET в главном меню переходим File \ New \ File и выбираем из списка шаблонов (см. рис. 11.3) XML Schema . Появляется окно с надписью "Чтобы начать, перетащите объекты из окна Server Explorer или Toolbox на рабочую область (область дизайна) или щелкните правой кнопкой" (рис. 11.1):
Дело в том, что мы находимся в режиме дизайна. Переключаемся в режим кода, для чего нажимаем на кнопку(XML):
Первая строка - это уже знакомое указание на то, что схема представляет собой XML-документ с корневым элементом xs:schema . Префикс xs : предваряет все элементы схемы, указывая на свое пространство имен. Во второй строке располагается длинное, подробное и зачастую совершенно ненужное описание схемы (сравните с аналогичным кодом для HTML-страниц). Для корректной работы вполне достаточно ограничиться следующим представлением:
Переключаемся на вкладку(Data) и видим всего одну запись (рис. 11.2).
Рис. 11.2. Документ XMLEasy.xml в режиме просмотра Data
Создать схему, описывающую этот документ, можно несколькими способами: в главном меню выбрать пункт "XML \ Create Schema" (рис. 11.3, А), в режиме XML в контекстном меню выбрать этот же пункт (рис. 11.3, Б), в режиме Data в контекстном меню выбрать этот пункт (рис. 11.3, В), и, наконец, в режиме Data нажать на кнопку панели инструментов XML (рис. 11.3, Г).
В любом случае появляется схема документа в виде таблицы (рис. 11.4). Оставим пока режим Schema и переключимся в режим(XML).
Рис. 11.4. Схема документа. Для наглядности для трех всплывающих подсказок был сделан коллаж
Среда сгенерировала XML-код, описывающий структуру документа:
Документ XMLEasy.xsd был автоматически создан в той же самой директории, где находится XMLEasy.xml.
В программном обеспечении к курсу вы найдете все файлы этой таблицы в папке XSD (Code\Glava5\ XSD).
Задание типа данных в XML-документе (последний пример - табл. 11.1) - один из способов ограничения содержимого. Для ограничения значения заданного типа применяются дополнительные атрибуты. В следующем фрагменте схемы значение элемента PRICE должно быть в пределах от 50 до 100:
Для ограничения XML-документа некоторыми фиксированными значениями используется следующая конструкция:
Здесь элемент NAME может принимать только одно фиксированное значение из пяти названий стран.
Итак, что же мы будем делать, для того, что бы научиться штамповать XML на основе вашего эталона? Опишу всё по порядку.
Имеется:
Какой то XML (xmlfile.xml), сохраненный в текстовом формате в файл. Ниже приведу текст:
Шаг 1. Создание XSD из XML.
- Утилита xsd.exe - создатель Microsoft.
- Утилита xsd2code.exe - стороннее приложение, которое умеет все тоже самое, что и xsd.exe, но доступно для скачивания напрямую (на данный момент стала платной с Trial периодом).
- Использование любых онлайн сервисов.
- Далее перейдя в папку:
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 можно увидеть, что мы сохранили так, как мы хотели (Нижний файл - "Созданный кодом").
Как мы видим, форматирование было соблюдено, а данные были наполнены нами.
В этой главе будет показано, как написать XML-схемы. Вы также узнаете, что схема может быть записана по-разному.
Документа XML
Давайте посмотрим на этот XML - документ под названием "shiporder.xml" :
Документ XML выше состоит из корневого элемента, "shiporder" , который содержит обязательный атрибут под названием "orderid" . "shiporder" элемент содержит три различных дочерних элемента: "orderperson" , "shipto" и "item" . "item" элемент появляется дважды, и он содержит "title" , необязательный "note" элемент, "quantity" , и "price" элемент.
Создание XML-схемы
Теперь мы хотим создать схему для документа XML выше.
Мы начнем с открытия нового файла , который мы будем называть "shiporder.xsd" . Для того, чтобы создать схему мы могли бы просто следовать структуре в документе XML и определите каждый элемент, как мы находим его. Мы начнем со стандартной декларации XML с последующим хз: элемент схемы, который определяет схему:
Далее, мы должны определить "shiporder" элемент. Этот элемент имеет атрибут и содержит другие элементы, поэтому мы рассматриваем его как сложный тип. Дочерние элементы "shiporder" элемент окружен хз: элемент последовательности , которая определяет упорядоченную последовательность субэлементов:
<xs:element name="shiporder"><xs:complexType>
<xs:sequence>
.
</xs:sequence>
</xs:complexType>
</xs:element>
Затем мы должны определить "orderperson" элемент в качестве простого типа (так как она не содержит каких - либо атрибутов или других элементов). В типа (xs:string) с префиксом префикс пространства имен , связанного с XML - схемы , которая указывает заранее определенный тип данных схемы:
Далее, мы должны определить два элемента , которые имеют сложного типа: "shipto" и "item" . Мы начнем с определения "shipto" элемент:
<xs:element name="shipto"><xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
С помощью схем, которые мы можем определить количество возможных появлений для элемента с MaxOccurs и атрибутами MinOccurs. MaxOccurs определяет максимальное число вхождений для элемента и MinOccurs определяет минимальное число вхождений для элемента. Значение по умолчанию для обоих MaxOccurs и MinOccurs 1!
Теперь мы можем определить "item" элемент. Этот элемент может появляться несколько раз внутри "shiporder" элемента. Это определяется установкой maxOccurs атрибут "item" элемента "unbounded" , что означает , что там может быть много вхождений "item" элемент , как автор хочет. Обратите внимание на то, что "note" элемент не является обязательным. Мы определили это, установив minOccurs атрибут к нулю:
<xs:element name="item" maxOccurs="unbounded"><xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Теперь мы можем объявить атрибут "shiporder" элемента. Поскольку это обязательный атрибут мы указываем использование = "требуется".
Note: Заявления атрибутов всегда должны прийти в последний раз :
Вот полный список файла схемы под названием "shiporder.xsd" :
Разделите схемы
Предыдущий метод дизайн очень прост, но может быть трудно читать и поддерживать, когда документы являются сложными.
Следующий метод дизайн основан на определении всех элементов и атрибутов, а затем ссылаясь на них , используя ref атрибут.
Вот новый дизайн файла схемы ("shiporder.xsd") :
<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>
Использование именованных типов
Способ третий дизайн определяет классы или типы, что позволяет повторно использовать определения элементов. Это делается путем именования элементов simpleTypes и complexTypes, а затем указать на них через type атрибута элемента.
Вот уже третий дизайн файла схемы ("shiporder.xsd") :
<xs:simpleType name="inttype">
<xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:complexType name="shipordertype">
<xs:sequence>
<xs:element name="orderperson" type="stringtype"/>
<xs:element name="shipto" type="shiptotype"/>
<xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
</xs:sequence>
<xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
Элемент ограничение указывает на то, что тип данных был получен из пространства имен типа данных XML-схемы W3C. Таким образом, следующий фрагмент означает, что значение элемента или атрибута должно быть значение строки:
Элемент ограничение чаще используется, чтобы применить ограничения к элементам. Посмотрите на следующие строки из приведенной выше схеме:
<xs:simpleType name="orderidtype"><xs:restriction base="xs:string">
<xs:pattern value="7"/>
</xs:restriction>
</xs:simpleType>
Это указывает на то, что значение элемента или атрибута должно быть строкой, оно должно быть ровно шесть символов в строке, и эти символы должны быть числом от 0 до 9.
Определение схемы XML, широко известное как XSD, является способом точного описания языка XML. XSD проверяет правильность структуры и словаря XML-документа по отношению к грамматическим правилам соответствующего языка XML.
На следующей диаграмме показано, как XSD используется для структурирования документов XML:
Вот простой код XSD. Посмотрите на это.
Характеристики
XML XSD хранится в отдельном документе, и затем документ может быть связан с документом XML для его использования.
Синтаксис
Основной синтаксис XSD следующий:
Элемент <Schema>
Схема является корневым элементом XSD, и это всегда требуется.
Приведенный выше фрагмент указывает, что любые элементы, объявленные в этой схеме, должны быть квалифицированы в пространстве имен, прежде чем использовать их в любом документе XML. Это необязательно.
Схема ссылок
Взгляните на следующую схему ссылок:
Приведенный выше фрагмент определяет объявление пространства имен по умолчанию. Это пространство имен используется средством проверки схемы, что все элементы являются частью этого пространства имен. Это необязательно.
После определения xsi экземпляра XMLSchema используйте атрибут schemaLocation . Этот атрибут имеет два значения: пространство имен и местоположение XML-схемы, которые будут использоваться через пробел. Это необязательно.
Мы будем использовать XSD-валидатор на основе Java для валидирования student.xml и по адресу student.xsd.
students.xml
students.xsd
XSDValidator.java
Шаги для проверки XML на XSD
Скопируйте файл XSDValidator.java в любое место, например, E: > java
Скопируйте Students.xml в то же место E: > Java
Скопируйте Students.xsd в том же месте E: > Java
Скомпилируйте XSDValidator.java с помощью консоли. Убедитесь, что на вашем компьютере установлен JDK 1.5 и более поздних версий и настроены пути к классам. Подробнее о том, как использовать JAVA, смотрите Учебное пособие по JAVA.
Скопируйте файл XSDValidator.java в любое место, например, E: > java
Скопируйте Students.xml в то же место E: > Java
Скопируйте Students.xsd в том же месте E: > Java
Скомпилируйте XSDValidator.java с помощью консоли. Убедитесь, что на вашем компьютере установлен JDK 1.5 и более поздних версий и настроены пути к классам. Подробнее о том, как использовать JAVA, смотрите Учебное пособие по JAVA.
Запустите XSDValidator, указав в качестве аргумента Students.xsd и Students.xml .
Запустите XSDValidator, указав в качестве аргумента Students.xsd и Students.xml .
Проверьте вывод
В этой главе мы увидим простые типы, которые определяет XSD.
Простой элемент может содержать только текст. Он не может содержать никаких других элементов.
Атрибут сам по себе является типом и используется в сложном элементе.
Ограничение определяет допустимые значения элемента XML.
Простой элемент может содержать только текст. Он не может содержать никаких других элементов.
Атрибут сам по себе является типом и используется в сложном элементе.
Ограничение определяет допустимые значения элемента XML.
Определите сложный тип, а затем создайте элемент, используя атрибут типа
Определите сложный тип непосредственно, назвав
Определите сложный тип, а затем создайте элемент, используя атрибут типа
Определите сложный тип непосредственно, назвав
Определите сложный тип, а затем создайте элемент, используя атрибут типа.
Определите сложный тип непосредственно, назвав.
Ниже приведен список сложных типов, которые поддерживает XSD.
Сложный Пустой элемент сложного типа может иметь только атрибуты, но без содержимого.
Элемент сложного типа «Только элементы» может содержать только элементы
Текстовый элемент сложного типа может содержать только атрибут и текст.
Смешанный элемент сложного типа может содержать элемент, атрибут и текст.
Индикаторы контролируют способы организации элементов в документе XML.
Элемент <any> используется для элементов, которые не определены схемой
Атрибут <anyAttribute> используется для атрибута, который не определен схемой.
Сложный Пустой элемент сложного типа может иметь только атрибуты, но без содержимого.
Элемент сложного типа «Только элементы» может содержать только элементы
Текстовый элемент сложного типа может содержать только атрибут и текст.
Смешанный элемент сложного типа может содержать элемент, атрибут и текст.
Индикаторы контролируют способы организации элементов в документе XML.
Элемент <any> используется для элементов, которые не определены схемой
Атрибут <anyAttribute> используется для атрибута, который не определен схемой.
Строковые типы данных используются для представления символов в документах XML.
<xs: string> тип данных
Тип данных <xs: string> может содержать символы, переводы строк, возврат каретки и символы табуляции. Процессор XML не заменяет символы перевода строки, возврата каретки и символов табуляции в содержимом пробелами и сохраняет их нетронутыми. Например, несколько пробелов или вкладок сохраняются во время отображения.
Пример <xs: string>
<xs: token> тип данных
Тип данных <xs: token> является производным от типа данных <string> и может принимать символы, переводы строк, возврат каретки и символы табуляции. Процессор XML удалит переводы строк, табуляции, возврат каретки, начальные и конечные пробелы и несколько пробелов.
Пример <xs: token>
Типы данных String
Ниже приведен список часто используемых типов данных, которые являются производными от типа данных <string>.
Представляет атрибут ID в XML и используется в атрибутах схемы.
Представляет атрибут IDREF в XML и используется в атрибутах схемы.
Представляет действительный идентификатор языка
Представляет правильное имя XML
Представляет атрибут NMTOKEN в XML и используется в атрибутах схемы.
normalizedString
Представляет строку, которая не содержит перевода строки, возврата каретки или табуляции.
Представляет строку, которая может содержать переводы строк, возврат каретки или вкладки.
Представляет строку, которая не содержит перевода строки, возврата каретки, табуляции, начальных или конечных пробелов или нескольких пробелов
Представляет атрибут ID в XML и используется в атрибутах схемы.
Представляет атрибут IDREF в XML и используется в атрибутах схемы.
Представляет действительный идентификатор языка
Представляет правильное имя XML
Представляет атрибут NMTOKEN в XML и используется в атрибутах схемы.
normalizedString
Представляет строку, которая не содержит перевода строки, возврата каретки или табуляции.
Представляет строку, которая может содержать переводы строк, возврат каретки или вкладки.
Представляет строку, которая не содержит перевода строки, возврата каретки, табуляции, начальных или конечных пробелов или нескольких пробелов
ограничения
- перечисление
- длина
- максимальная длина
- MINLENGTH
- шаблон
- WHITESPACE
Типы данных Date и Time используются для представления даты и времени в документах XML.
<xs: date> тип данных
Тип данных <xs: date> используется для представления даты в формате ГГГГ-ММ-ДД.
Пример <xs: date>
тип данных <xs: time>
Тип данных <xs: time> используется для представления времени в формате чч: мм: сс.
Пример <xs: time>
<xs: datetime> тип данных
Тип данных <xs: datetime> используется для представления даты и времени в формате ГГГГ-ММ-ДДЧч: мм: сс.
XSD — это язык описания структуры XML документа. Его также называют XML Schema. При использовании XML Schema XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных.
Такой подход позволяет объектно-ориентированным языкам программирования легко создавать объекты в памяти, что, несомненно, удобнее, чем разбирать XML как обычный текстовый файл.
Кроме того, XSD расширяем, и позволяет подключать уже готовые словари для описания типовых задач, например веб-сервисов, таких как SOAP.
Стоит также упомянуть о том, что в XSD есть встроенные средства документирования, что позволяет создавать самодостаточные документы, не требующие дополнительного описания.
Рассмотрим в качестве примера XSD документ, описывающий часть структуры аккаунта на хабре.
Текст XSD схемы и XML документ, соответствующий этой схеме я не стал включать в статью из-за их размера.
Первая строчка схемы указывает, что документ является XML документом и использует кодировку UTF-8.
< 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 ="2522-14-34 14:31:36" />
</ 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.
Читайте также: