Xsd minoccurs 0 что это
Показатели XSD
Мы можем контролировать то, как элементы должны использоваться в документах с индикаторами.
индикаторы
Есть семь показателей:
Индикаторы Заказать
Индикаторы заказа используются для определения порядка элементов.
Все Индикатор
Выбор индикатора
Индикатор чередования фаз
Показатели Встречаемость
Показатели Встречаемость используются для определения, как часто может произойти элемент.
Note: Для всех «Order» и «Group» показателей (любой, все, выбор, последовательность, название группы, и группа справки) значение по умолчанию для MaxOccurs и MinOccurs 1.
MaxOccurs Индикатор
индикатор определяет максимальное количество раз может возникнуть элемент:
MinOccurs Индикатор
индикатор определяет минимальное число раз может произойти элемент:
Tip: Чтобы разрешить элемент появляться неограниченное число раз, используйте MaxOccurs = «неограниченную» заявление:
Hege Refsnes
Cecilie
Tove Refsnes
Hege
Stale
Jim
Borge
Вот файл схемы «family.xsd» :
Группа Показатели
Показатели группы используются для определения связанных наборов элементов.
Элемент группы
групп элементов определяются с декларацией группы, как это:
После того, как вы определили группу, вы можете ссылаться на нее в другом определении, как это:
Группы атрибутов
Атрибут группы определяются с декларацией attributeGroup, как это:
Следующий пример определяет атрибут группу под названием «personattrgroup» :
После того как вы определили группы атрибутов, вы можете ссылаться на нее в другом определении, как это:
Инструменты пользователя
Инструменты сайта
Содержание
Аннотации
компонент может иметь атрибут xml: lang, в котором указывается язык написания самой аннотации.
разработки, таблицы стилей и других приложений. Например, в середине компонента appInfo можно представить информацию о том, какие фасетки могут быть применены к каждому простого типа.
Типы данных
Объявление элемента
Обратите также внимание на то, что при указании типа элемента обязательно необходимо задавать пространство имен:
Объявление атрибутов
Необязательный атрибут use может принимать одно из следующих значений:
Простые и комплексные типы данных
simpleType
Простые типы в основном используются для сужение типов (restriction)
Cужение типов (restriction)
С помощью сужение типов (restriction) Мы можем контролировать любой тип данных на наличие его значения то есть ограничивать его значения
Приме: Схема
Название фасетки | Описание | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
Наибольшее значение, которое больше не входит в определяем тип | ||||||||||
Наибольшее значение определяемого типа | ||||||||||
Наименьшее значение, которое больше не входит в Определяемый тип | ||||||||||
Наименьшее значение определяемого типа | ||||||||||
Общее количество цифр в определяемого числовом типе; сужение типа decimal | ||||||||||
Количество цифр в дробной части числа | ||||||||||
Длина значений определяемого типа | ||||||||||
Наибольшая длина значений определяемого типа | ||||||||||
Наименьшее длина значений определяемого типа | ||||||||||
Одно из перечисленных значений | ||||||||||
В тегах-фасетка также могут иметь атрибуты. Эти атрибуты называют базисными фасетками (fundamental facets). Среди них выделяют: complexTypeСхема: базовый элемент Группы элементовГруппа позволяет описать общие элементы. (работает как include) Схема: Что такое XMLЕсли вы тестируете API, то должны знать про два основных формата передачи данных: XML, в переводе с англ eXtensible Markup Language — расширяемый язык разметки. Используется для хранения и передачи данных. Так что увидеть его можно не только в API, но и в коде. Этот формат рекомендован Консорциумом Всемирной паутины (W3C), поэтому он часто используется для передачи данных по API. В SOAP API это вообще единственно возможный формат входных и выходных данных!
Так что давайте разберемся, как он выглядит, как его читать, и как ломать! Да-да, а куда же без этого? Надо ведь выяснить, как отреагирует система на кривой формат присланных данных. СодержаниеКак устроен XMLВозьмем пример из документации подсказок Дадаты по ФИО: И разберемся, что означает эта запись. В XML каждый элемент должен быть заключен в теги. Тег — это некий текст, обернутый в угловые скобки: Текст внутри угловых скобок — название тега. Ой, ну ладно, подловили! Не всегда. Бывают еще пустые элементы, у них один тег и открывающий, и закрывающий одновременно. Но об этом чуть позже! С помощью тегов мы показываем системе «вот тут начинается элемент, а вот тут заканчивается». Это как дорожные знаки: — На въезде в город написано его название: Москва * Пример с дорожными знаками я когда-то давно прочитала в статье Яндекса, только ссылку уже не помню. А пример отличный! Корневой элементВ любом XML-документе есть корневой элемент. Это тег, с которого документ начинается, и которым заканчивается. В случае REST API документ — это запрос, который отправляет система. Или ответ, который она получает. Чтобы обозначить этот запрос, нам нужен корневой элемент. В подсказках корневой элемент — «req». Он мог бы называться по другому: Да как угодно. Он показывает начало и конец нашего запроса, не более того. А вот внутри уже идет тело документа — сам запрос. Те параметры, которые мы передаем внешней системе. Разумеется, они тоже будут в тегах, но уже в обычных, а не корневых. Значение элементаЗначение элемента хранится между открывающим и закрывающим тегами. Это может быть число, строка, или даже вложенные теги! Вот у нас есть тег «query». Он обозначает запрос, который мы отправляем в подсказки. Внутри — значение запроса. Это как если бы мы вбили строку «Виктор Иван» в GUI (графическом интерфейсе пользователя): Пользователю лишняя обвязка не нужна, ему нужна красивая формочка. А вот системе надо как-то передать, что «пользователь ввел именно это». Как показать ей, где начинается и заканчивается переданное значение? Для этого и используются теги. Система видит тег «query» и понимает, что внутри него «строка, по которой нужно вернуть подсказки». Параметр count = 7 обозначает, сколько подсказок вернуть в ответе. Если тыкать подсказки на демо-форме Дадаты, нам вернется 7 подсказок. Это потому, что туда вшито как раз значение count = 7. А вот если обратиться к документации метода, count можно выбрать от 1 до 20.
Атрибуты элементаУ элемента могут быть атрибуты — один или несколько. Их мы указываем внутри отрывающегося тега после названия тега через пробел в виде Зачем это нужно? Из атрибутов принимающая API-запрос система понимает, что такое ей вообще пришло. Например, мы делаем поиск по системе, ищем клиентов с именем Олег. Отправляем простой запрос: А в ответ получаем целую пачку Олегов! С разными датами рождения, номерами телефонов и другими данными. Допустим, что один из результатов поиска выглядит так: Давайте разберем эту запись. У нас есть основной элемент party. У него есть 3 атрибута: Внутри party есть элементы field. У элементов field есть атрибут name. Значение атрибута — название поля: имя, дата рождения, тип или номер телефона. Так мы понимаем, что скрывается под конкретным field. Это удобно с точки зрения поддержки, когда у вас коробочный продукт и 10+ заказчиков. У каждого заказчика будет свой набор полей: у кого-то в системе есть ИНН, у кого-то нету, одному важна дата рождения, другому нет, и т.д. Но, несмотря на разницу моделей, у всех заказчиков будет одна XSD-схема (которая описывает запрос и ответ): — есть элемент party; А вот конкретные названия полей уже можно не описывать в XSD. Их уже «смотрите в ТЗ». Конечно, когда заказчик один или вы делаете ПО для себя или «вообще для всех», удобнее использовать именованные поля — то есть «говорящие» теги. Какие плюшки у этого подхода: — При чтении XSD сразу видны реальные поля. ТЗ может устареть, а код будет актуален. В общем, любой подход имеет право на существование. Надо смотреть по проекту, что будет удобнее именно вам. У меня в примере неговорящие названия элементов — все как один будут field. А вот по атрибутам уже можно понять, что это такое. Помимо элементов field в party есть элемент attribute. Не путайте xml-нотацию и бизнес-прочтение: У элемента attribute есть атрибуты: Такая вот XML-ка получилась. Причем упрощенная. В реальных системах, где хранятся физ лица, данных сильно больше: штук 20 полей самого физ лица, несколько адресов, телефонов, емейл-адресов… Но прочитать даже огромную XML не составит труда, если вы знаете, что где. И если она отформатирована — вложенные элементы сдвинуты вправо, остальные на одном уровне. Без форматирования будет тяжеловато… А так всё просто — у нас есть элементы, заключенные в теги. Внутри тегов — название элемента. Если после названия идет что-то через пробел: это атрибуты элемента. XML прологИногда вверху XML документа можно увидеть что-то похожее: Эта строка называется XML прологом. Она показывает версию XML, который используется в документе, а также кодировку. Пролог необязателен, если его нет — это ок. Но если он есть, то это должна быть первая строка XML документа. UTF-8 — кодировка XML документов по умолчанию. XSD-схемаXSD (XML Schema Definition) — это описание вашего XML. Как он должен выглядеть, что в нем должно быть? Это ТЗ, написанное на языке машины — ведь схему мы пишем… Тоже в формате XML! Получается XML, который описывает другой XML. Фишка в том, что проверку по схеме можно делегировать машине. И разработчику даже не надо расписывать каждую проверку. Достаточно сказать «вот схема, проверяй по ней». Если мы создаем SOAP-метод, то указываем в схеме: Поэтому зачем запускать сложную процедуру, если запрос заведом «плохой»? И выдавать ошибку через 5 минут, а не сразу? Валидация по схеме помогает быстро отсеять явно невалидные запросы, не нагружая систему. Более того, похожую защиту ставят и некоторые программы-клиенты для отправки запросов. Например, SOAP Ui умеет проверять ваш запрос на well formed xml, и он просто не отправит его на сервер, если вы облажались. Экономит время на передачу данных, молодец! А простому пользователю вашего SOAP API схема помогает понять, как составить запрос. Кто такой «простой пользователь»? Итого, как используется схема при разработке SOAP API:
Попробуем написать для него схему. В запросе должны быть 3 элемента (email, name, password) с типом «string» (строка). Пишем: А в WSDl сервиса она записана еще проще: Конечно, в схеме могут быть не только строковые элементы. Это могут быть числа, даты, boolean-значения и даже какие-то свои типы: А еще в схеме можно ссылаться на другую схему, что упрощает написание кода — можно переиспользовать схемы для разных задач. Практика: составляем свой запросОк, теперь мы знаем, как «прочитать» запрос для API-метода в формате XML. Но как его составить по ТЗ? Давайте попробуем. Смотрим в документацию. И вот почему я даю пример из Дадаты — там классная документация! Что, если я хочу, чтобы мне вернуть только женские ФИО, начинающиеся на «Ан»? Берем наш исходный пример: В первую очередь меняем сам запрос. Теперь это уже не «Виктор Иван», а «Ан»: Далее смотрим в ТЗ. Как вернуть только женские подсказки? Есть специальный параметр — gender. Название параметра — это название тегов. А внутри уже ставим пол. «Женский» по английски будет FEMALE, в документации также. Итого получили: Ненужное можно удалить. Если нас не волнует количество подсказок, параметр count выкидываем. Ведь, согласно документации, он необязательный. Получили запрос: Вот и все! Взяли за основу пример, поменяли одно значение, один параметр добавили, один удалили. Не так уж и сложно. Особенно, когда есть подробное ТЗ и пример )))
Well Formed XMLРазработчик сам решает, какой XML будет считаться правильным, а какой нет. Но есть общие правила, которые нельзя нарушать. XML должен быть well formed, то есть синтаксически корректный. Чтобы проверить XML на синтаксис, можно использовать любой XML Validator (так и гуглите). Я рекомендую сайт w3schools. Там есть сам валидатор + описание типичных ошибок с примерами. В готовый валидатор вы просто вставляете свой XML (например, запрос для сервера) и смотрите, всё ли с ним хорошо. Но можете проверить его и сами. Пройдитесь по правилам синтаксиса и посмотрите, следует ли им ваш запрос. Правила well formed XML: Давайте пройдемся по каждому правилу и обсудим, как нам применять их в тестировании. То есть как правильно «ломать» запрос, проверяя его на well-formed xml. Зачем это нужно? Посмотреть на фидбек от системы. Сможете ли вы по тексту ошибки понять, где именно облажались? 1. Есть корневой элементНельзя просто положить рядышком 2 XML и полагать, что «система сама разберется, что это два запроса, а не один». Не разберется. Потому что не должна. И если у вас будет лежать несколько тегов подряд без общего родителя — это плохой xml, не well formed. Всегда должен быть корневой элемент:
Что мы делаем для тестирования этого условия? Правильно, удаляем из нашего запроса корневые теги! 2. У каждого элемента есть закрывающийся тегТут все просто — если тег где-то открылся, он должен где-то закрыться. Хотите сломать? Удалите закрывающийся тег любого элемента. Но тут стоит заметить, что тег может быть один. Если элемент пустой, мы можем обойтись одним тегом, закрыв его в конце: Это тоже самое, что передать в нем пустое значение Аналогично сервер может вернуть нам пустое значение тега. Можно попробовать послать пустые поля в Users в методе FullUpdateUser. И в запросе это допустимо (я отправила пустым поле name1), и в ответе SOAP Ui нам именно так и отрисовывает пустые поля. Итого — если есть открывающийся тег, должен быть закрывающийся. Либо это будет один тег со слешом в конце. Для тестирования удаляем в запросе любой закрывающийся тег. 3. Теги регистрозависимыКак написали открывающий — также пишем и закрывающий. ТОЧНО ТАК ЖЕ! А не так, как захотелось. А вот для тестирования меняем регистр одной из частей. Такой XML будет невалидным 4. Правильная вложенность элементовЭлементы могут идти друг за другом Один элемент может быть вложен в другой Но накладываться друг на друга элементы НЕ могут! 5. Атрибуты оформлены в кавычкахДаже если вы считаете атрибут числом, он будет в кавычках: Для тестирования пробуем передать его без кавычек: ИтогоXML (eXtensible Markup Language) используется для хранения и передачи данных.
Хранение данных — это когда XML встречается внутри кода. Его легко понимает как машина, так и человек. В формате XML можно описывать какие-то правила, которые будут применяться к данным, или что-то еще. Вот пример использования XML в коде open-source проекта folks. Я не знаю, что именно делает JacksonJsonProvider, но могу «прочитать» этот код — есть функционал, который мы будем использовать (featuresToEnable), и есть тот, что нам не нужен(featuresToDisable). Формат XML подчиняется стандартам. Синтаксически некорректный запрос даже на сервер не уйдет, его еще клиент порежет. Сначала проверка на well formed, потом уже бизнес-логика. Правила well formed XML: Если вы тестировщик, то при тестировании запросов в формате XML обязательно попробуйте нарушить каждое правило! Да, система должна уметь обрабатывать такие ошибки и возвращать адекватное сообщение об ошибке. Но далеко не всегда она это делает. А если система публичная и возвращает пустой ответ на некорректный запрос — это плохо. Потому что разработчик другой системы налажает в запросе, а по пустому ответу даже не поймет, где именно. И будет приставать к поддержке: «Что же у меня не так?», кидая информацию по кусочкам и в виде скринов исходного кода. Оно вам надо? Нет? Тогда убедитесь, что система выдает понятное сообщение об ошибке! Что такое JSON — второй популярный формат PS — больше полезных статей ищите в моем блоге по метке «полезное». А полезные видео — на моем youtube-канале Индикаторы использования XML элементовМы можем контролировать, каким образом элементы должны использоваться в XML документах. Это позволяют сделать индикаторы. Всего существует семь индикаторов: Индикаторы очередностиИндикаторы очередности, как ясно из названия, используются для определения очередности появления элементов в XML документе. Индикатор all Индикатор устанавливает, что дочерние элементы могут появляться в документах в любом порядке, и что каждый из этих дочерних элементов должен появляться всего один раз: Примечание: При использовании индикатора вы можете установить индикатор в значение 0 или 1, а индикатор только в значение 1 (индикаторы и описываются ниже). Индикатор choice Индикатор устанавливает, что появляться в документах может либо один дочерний элемент, либо другой: Индикатор sequence Индикатор устанавливает, что дочерние элементы должны появляться в документах в заданном порядке: Индикаторы частотностиИндикаторы частотности используются для того, чтобы определить то, как часто элементы могут появляться в XML документах. Примечание: Для всех «порядковых» и «групповых» индикаторов (any, all, choice, sequence, group name и group reference) значением по умолчанию для maxOccurs и minOccurs является 1. Индикатор maxOccurs Индикатор устанавливает максимальное количество появлений элемента: Индикатор minOccurs Индикатор устанавливает минимальное количество появлений элемента: В приведенном выше примере указывается, что элемент «child_name» в элементе «person» может использоваться минимум 0 раз и максимум 10 раз. Совет: Чтобы разрешить использовать какой-то элемент неограниченное число раз, используется выражение maxOccurs=»unbounded». XML файл «Myfamily.xml»: Приведенный XML файл содержит корневой элемент «persons». Внутри этого корневого элемента у нас есть три элемента «person». Каждый элемент «person» должен содержать элемент «full_name» и может содержать до 5 элементов «child_name». А вот его файл схемы «family.xsd»: Индикаторы группированияИндикаторы группирования используются для определения связанных наборов элементов. Группирование элементов Группы элементов определяются при помощи декларации group следующим образом: Внутри такой декларации необходимо определять элемент all, choice или sequence. В следующем примере определяется группа с именем «persongroup», которая определяет группу элементов, которые должны появляться точно в указанном порядке: После того как группа элементов была определена, вы можете использовать ее в других определениях: Группирование атрибутов Группы атрибутов определяются при помощи декларации attributeGroup: В следующем примере определяется группа атрибутов с именем «personattrgroup»: После того как группа атрибутов была определена, вы можете использовать ее в других определениях: XSD: частичная валидацияXSD — это язык описания структуры XML документа. Его также называют XML Schema. При использовании XML Schema XML-парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных. Многие так или иначе сталкивались с процедурой полной валидации, обеспечивающей соответствие документа заданной схеме или сообщающей о возможных ошибках. В данной статье речь пойдет о частичной валидации, кроме вышеописанного, позволяющей конструировать валидные документы «на лету». Мы разберемся, какие возможности может предоставить такой подход и способы его реализации. Основная цельЗачем вообще может понадобиться конструировать документ, обладающий заданными свойствами, и какими свойствами мы можем управлять? На первый вопрос ответ практически очевиден; большинство документов не являются просто текстом, а наделены некоторой семантикой. XML решает вопрос синтаксического представления, а схема – частично решает вопрос семантического значения. Благодаря соответствию документа схеме, можно выполнять над ним набор предопределенных действий, допустимых для целого класса валидных документов, будь то представление в другом формате, экспорт значимой части информации для конкретной задачи, импорт новой информации с учетом глобальных ограничений. Наиболее часто применяемый механизм в таком случае – это XSLT преобразование, смысл которого можно проиллюстрировать следующей диаграммой: Часто возникает желание модифицировать документ, уже отвечающий выбранной схеме, таким образом, чтобы он не потерял валидность. Здесь речь идет и о автоматических модификациях, например добавление веб-агентами (агрегаторами) информации в документ или модифицирующие запросы в XML-базу данных, так и о ручной модификации, скажем, в визуальном XML-редакторе. Операция полной валидации для больших документов может занимать существенное время, десятки секунд и более, что в целом препятствует использованию подхода «атомарное изменение – проверка – отказ/разрешение». А для визуальных редакторов хотелось бы еще больше – иметь возможность не только проверить атомарное действие, а предложить все допустимые по схеме варианты модификации конкретного узла. Однако, хорошие XML-редакторы умеют это делать, и мы попробуем разобраться каким образом у них это получается. Необходимая информация о XML схемеПравило Unique Particle Attribution (однозначность определения частиц) требует, чтобы каждый элемент документа однозначно соответствовал ровно одной частице xsd:element или xsd:any в модели содержимого родительского элемента [2]. Вообще говоря, правило Unique Particle Attribution (UPA) не является жестким требованием к структуре XML схем, а только крайне желательной рекомендацией и часть используемых схем ему не соответствует. Рассмотрим простейший пример, иллюстрирующий нарушение правила однозначности определения частиц. Построение валидатора1. Построение недетерминированного конечного автомата (NFA) с заданным конечным состоянием S по заданной частице: b. Если MaxOccurs частицы равен бесконечности (inf): c. Если MaxOccurs частицы – число m: d. Достраиваем minOccurs копий преобразования терма от нового начального состояния n, до начального состояния, полученного на предыдущих шагах. 2. Построение недетерминированного конечного автомата с заданным принимающим состоянием S по заданному терму: b. Если терм – описание элемента: c. Если терм – выбор (choice): d. Если терм – последовательность (sequence): Затем применим алгоритм Томпсона к полученным NFA [3], для построения детерминированных автоматов. Алгоритм Томпсона можно применить в тех же случаях, что и алгоритм построения детерминированного автомата Ахо и Ульмана, основанный на сворачивании одинаково помеченных не-эпсилон ребер [4]. Однако в ряде случаев по исходному автомату (созданному на шагах 1–2) алгоритм Ахо и Ульмана не сможет построить детерминированный автомат. Осталось решить последнюю задачу – выбор нужного конечного автомата при валидации операции над заданным элементом дерева. С этим нам поможет структура привязки типов валидации (PSVI, Post-Schema-Validation Infoset), порождаемая почти любым (например, MSXML или libxml) полным валидатором. Для любого элемента дерева она указывает на соответствующий ему тип в описании схемы – в точности тот, по которому мы порождали нужный автомат. В нашем случае реализация структуры PSVI представляется ссылкой на тип схемы для каждого элемента дерева. Операции MOVE и REMOVE не меняют тип операнда (поэтому не требуют изменения структуры PSVI), а операция ADD вместе с добавлением элемента x, потребует добавления в структуру PSVI типа x. Таким образом, вместе с изменением структуры мы меняем и информационное множество привязки типов валидации, решая задачу частичной валидации и поддерживая дерево PSVI без вызова внешнего валидатора.
|