admin / 28.08.2018

XSD — умный XML / Хабр

Форум: «Основная»;
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Валидация XML 

Unknown_user   (2011-02-23 16:50) [0]

Подскажите как в Delphi XE можно выполнить валидацию XML файла согласно XSD схеме. Схема хранится локально и ссылка на нее в XML файле отсутствует. Желательно использование объекта MS XML.


KilkennyCat ©   (2011-02-23 21:03) [1]

http://www.sql.ru/forum/actualthread.aspx?tid=596328


KilkennyCat ©   (2011-02-23 21:08) [2]

забыл сказать — это первая строчка в гугле.

xsd уже лет десять.
задачу валидности трудно назвать нетипичной.
делфи тоже не вчера появилась.

исходя из этого, странно задавать такой вопрос.


Unknown_user   (2011-02-23 21:24) [3]

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

То есть нужна функция вроде

function ValidateXML(XMLFileName, XSDFileName: string; ErrStrs: TStrings): Boolean;

где

XMLFileName —  путь к XML файлу для проверки,
XSDFileName — путь к файлу схемы,
ErrStrs — список всех найденных ошибок

функция возвращает True, если XML well-formed и валидный.


Unknown_user   (2011-02-23 21:30) [4]

Не сомневайтесь, я умею пользоваться поиском. В инете действительно много инфы по данному вопросу. Но существует множество версий MS XML, поэтому в описании интерфейсов в делфи можно заблудиться. И не так просто найти работающий пример.

Собственно говоря, я уже разобрался. Однако, все еще интересно ваше решение.


Игорь Шевченко ©   (2011-02-23 21:43) [5]

function DOMCheckByXSDWithNamespace(XML: IXMLDOMDocument2; const XsdDoc: string;
 var ErrMsg: string; const aNamespace: string = ""): boolean;
var
 SchCache: IXMLDOMSchemaCollection;
 aXML: IXMLDOMDocument2;
 Path: OleVariant;
 xmlErr: string;
 XsdBuffer: array[0..MAX_PATH] of Char;
 XsdFilePart: PChar;
begin
 Path := XsdDoc;
 SchCache := nil;
 if MSXML6Installed then
   SchCache := CoXMLSchemaCache60.Create
 else if MSXML4Installed then
   SchCache := CoXMLSchemaCache40.Create
 else if MSXML3Installed then
   SchCache := CoXMLSchemaCache30.Create;
 SchCache.add(aNamespace, Path);
 aXML := CreateXMLDOM;
 aXML.Schemas := SchCache;
 aXML.Async := False;
 aXML.ValidateOnParse := True;
 aXML.SetProperty("NewParser", True);
 aXML.loadXML(XML.xml);
 Result := aXML.parseError.errorCode = 0;
 if not Result then
 begin
   with aXML.ParseError do
   begin
     ErrMsg := Format(EM_PARSE_ERROR, [ErrorCode, Line, LinePos, Reason]);
   end;
 end;
end;

ну вот как-то так…


Unknown_user   (2011-02-23 21:57) [6]

> Игорь Шевченко

Да, этот код работает, но не выполняется требование выдавать весь список найденных ошибок.


KilkennyCat ©   (2011-02-23 23:06) [7]


> Но существует множество версий MS XML, поэтому в описании
> интерфейсов в делфи можно заблудиться. И не так просто найти
> работающий пример.

сказки будешь детям рассказывать.
второй шаг по выше приведенной ссылке приводит к работающему примеру.


Unknown_user   (2011-02-24 00:49) [8]

>второй шаг по выше приведенной ссылке приводит к работающему примеру.

Ткните носом, пожалуйста. Если имеется ввиду этот код, то он не удовлетворяет поставленной задаче.

 xmlDoc := CoDOMDocument.Create;
 xmlDoc.async := False;
 xmlDoc.load("c:\TextXml.xml");
 xmlErr := xmlDoc.validate;
 if xmlErr.errorCode <> 0 then
   ShowMessage(xmlErr.reason + #13#10 + xmlErr.srcText );

Игорь Шевченко привел пример валидации XML по произвольному XSD файлу (именно валидации согласно XSD, я упоминал уже не раз что мне нужно). Спасибо ему за это.

Но и этот код не удовлетворяет второму условию. Валидация останавливается на первой ошибке. Мне нужен список всех ошибок в XML.

Повторюсь, после публикации своего вопроса я таки разобрался по MSDN как это сделать. И это оказалось не так и сложно в итоге. Просто нигде не нашел готового решения. А KilkennyCat утверждает, что оно находится в первых ссылках, выдаваемых гуглом. Вот и стало интересно где же именно.


KilkennyCat ©   (2011-02-24 01:04) [9]


>  А KilkennyCat утверждает, что оно находится в первых ссылках,
>  выдаваемых гуглом. Вот и стало интересно где же именно.
>

ссылку давал.
второй пост в этой ссылке:

ради любопытства глянул явовскую реализацию. работает.

гугл, "MSDN XSD validation" — немеряно информации.

разъяснил?


Unknown_user   (2011-02-24 11:36) [10]

Ну если немеряно информации, найдите как выполнить валидацию с выдачей всего списка ошибок а не первой встреченной. Не в C#, там используются феймворк классы, в Delphi XE. Вы же конкретно так и не ответили ни разу. Что то не так с гуглом? Странно давать такие ответы.

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


KilkennyCat ©   (2011-02-24 12:23) [11]


> Вы же конкретно так и не ответили ни разу

я тебе что-то должен?


Unknown_user   (2011-02-24 12:27) [12]

Нет, конечно. Но и упрекать в некомпетентности тоже не нужно.


clickmaker ©   (2011-02-24 12:59) [13]

http://philo.de/xml/downloads.shtml


Форум: «Основная»;
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх

Память: 0.75 MB
Время: 0.114 c

Язык определения схем XSD

Консорциум W3C выработал рекомендацию языка определения схем XML (XSD), объединив наиболее популярные языки описания схем в один стандарт. Основная цель, которая при этом преследовалась, — получение стандарта, который можно широко реализовать и при этом он платформно-независимый.

Язык XML Schema Definition Language, который также называют XML Schema Language, во многом похож на язык XDR, с которым вы познакомились раньше. Схемы XSD способны решать следующие задачи:

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

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

Все элементы XSD начинаются с префикса , который указывается для пространства имен XSD, объявленного в корневом элементе экземпляра схемы.

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

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

Ссылка на конкретную схему приводится в атрибуте

Объявление элемента и атрибута XSD

Процесс создания схемы включает в себя два шага — определение и объявление типов элементов или типов атрибутов. Элементы и атрибуты XML-документа объявляются элементами схемы и . Структура же XML-документа определяется элементами схемы и .

Основное объявление элемента состоит из имени и типа данных

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

Атрибут — объявление простого типа, которое не может содержать другие элементы. Объявление атрибута похоже на объявление элемента:

Простые типы данных

Есть две главных категории простых типов:

  • встроенные типы;
  • определенные пользователем простые типы.

Язык XSD имеет большое количество данных. Встроенные типы включают в себя примитивные типы и производные. данных не получены из других типов данных. Например, числа с плавающей запятой — математическое понятие, которое не получено из других типов данных. данных определены в терминах существующих типов данных. Например, целое число — частный случай, полученный из десятичного типа данных.

Следующая таблица представляет список примитивных типов данных XML-схемы, аспекты, которые могут быть применены к типу данных и описания типа данных.

Тип данных Аспекты Описание
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет символьную строку.
pattern, whiteSpace Представляет логическое значение, которое может быть true или false.
enumeration, pattern, totalDigits, fractionDigits, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет произвольное число.
pattern, enumeration, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет 32-битовое число с плавающей запятой одиночной точности.
pattern, enumeration, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет 64-битовое число с плавающей запятой двойной точности.
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет продолжительность времени. Шаблон для duration следующий — PnYnMnDTnHnMnS, где nY представляет число лет; nM — месяцев; nD — дней; Т — разделитель даты и времени; nH — число часов; nM — минут; nS — секунд.
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет конкретное время. Шаблон для dateTime следующий — CCYY-MM-DDThh:mm:ss, где CC представляет столетие; YY — год; MM — месяц; DD — день; Т — разделитель даты и времени; hh — число часов; mm — минут; ss — секунд. При необходимости можно указывать доли секунды. Например, сотые доли в шаблоне: ss.ss
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет конкретное время дня. Шаблон для time следующий -hh:mm:ss.sss (долевая часть секунд необязательна).
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет календарную дату. Шаблон для date такой — CCYY-MM-DD (здесь необязательна часть, представляющая время).
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет конкретный месяц конкретного года (CCYY-MM ).
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет календарный год (CCYY).
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет конкретный день конкретного месяца (—MM-DD).
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет календарный день (—DD).
enumeration, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, whiteSpace Представляет календарный месяц (—MM—).
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет произвольную шестнадцатерично-закодированную двоичную информацию. HexBinary — набор двоичных октетов фиксированной длины, состоящий из четырех пар шестнадцатеоисных символов.

Например, 0-9a-fA-F.

length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет произвольную Base64-закодированную двоичную информацию. Base64Binary — набор двоичных октетов фиксированной длины.
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет URI как определено в RFC 2396. Значение anyURI может быть абсолютно или относительно, и может иметь необязательный идентификатор фрагмента.
length, enumeration, pattern, maxLength, minLength, whiteSpace Представляет составное имя. Имя составлено из префикса и локального названия, отделенного двоеточием. И префикс и локальные названия должны быть NCNAME. Префикс должен быть связан с namespace URI ссылкой, используя объявление пространства имени.
length, enumeration, pattern, maxLength, minLength, whiteSpace Представляет тип атрибута СИСТЕМЫ ОБОЗНАЧЕНИЙ. Набор QNAMES.

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

Тип данных Аспекты Описание
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет нормализованные строки. Этот тип данных получен из string.
enumeration, pattern, length, minLength, maxLength, whiteSpace Представляет маркированные строки. Этот тип данных получен из normalizedString.
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет идентификаторы естественного языка (определенный RFC 1766). Этот тип данных получен из token
length, maxLength, minLength, enumeration, whiteSpace Представляет тип атрибута IDREFS. Содержит набор значений типа IDREF.
length, maxLength, minLength, enumeration, whiteSpace Представляет тип атрибута ENTITIES. Содержит набор значений типа ENTITY.
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет тип атрибута NMTOKEN. NMTOKEN — набор символов имен (символы, цифры и другие символы) в любой комбинации. В отличие отName и NCNAME, NMTOKEN не имеет никаких ограничений на первый символ. Этот тип данных получен из token.
length, maxLength, minLength, enumeration, whiteSpace Представляет тип атрибута NMTOKENS. Содержит набор значений типа NMTOKEN.
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет имена в XML. Name — лексема(маркер), которая начинается с символа, символа подчеркивания или двоеточия и продолжается символами имен (символы, цифры, и другие символы). Этот тип данных получен из token.
length, pattern, maxLength, minLength, enumeration, whiteSpace Представляет неколонкированные названия. Этот тип данных — тот же, что и Name, но не может начинаться с двоеточия. Этот тип данных получен из Name.
length, enumeration, pattern, maxLength, minLength, whiteSpace Представляет тип атрибута ID, определенный в XML 1.0 Рекомендации. ИДЕНТИФИКАТОР не должен иметь двоеточия (NCName) и должен быть уникален в пределах XML документа. Этот тип данных получен из NCNAME.
length, enumeration, pattern, maxLength, minLength, whiteSpace Представляет ссылку к элементу, имеющему атрибут ID, который точно соответствует установленному ИДЕНТИФИКАТОРУ. IDREF должен быть NCNAME и должен быть значением элемента или атрибута типа ID в пределах XML документа. Этот тип данных получен из NCNAME.
length, enumeration, pattern, maxLength, minLength, whiteSpace Представляет тип атрибута ENTITY. Это — ссылка к неанализируемому объекту с именем, которое точно соответствует установленному имени. ENTITY должен быть NCNAME и должен быть объявлен в схеме как неанализируемое имя объекта. Этот тип данных получен из NCNAME.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет последовательность десятичных цифр с необязательным знаком (+ или -). Этот тип данных получен из decimal.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число, меньшее или равное нулю. NonPositiveInteger состоит из отрицательного знака (-) и последовательности десятичных цифр. Этот тип данных получен из целого числа.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число, меньшее нуля. Этот тип данных получен из nonPositiveInteger.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимальным значением -9223372036854775808 и максимумом 9223372036854775807. Этот тип данных получен из целого числа.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимальным значением -2147483648 и максимумом 2147483647. Этот тип данных получен из long.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимальным значением -32768 и максимумом 32767. Этот тип данных получен из int.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимальным значением -128 и максимумом 127. Этот тип данных получен из short.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число, большее равное нулю. Этот тип данных получен из целого числа.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимумом нуль и максимумом 18446744073709551615. Этот тип данных получен из nonNegativeInteger.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимумом нуль и максимумом 4294967295. Этот тип данных получен из unsignedLong.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимумом нуль и максимумом 65535. Этот тип данных получен из unsignedInt.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число с минимумом нуля и максимума 255. Этот тип данных получен из unsignedShort.
enumeration, fractionDigits, pattern, minInclusive, minExclusive, maxInclusive, maxExclusive, totalDigits, whiteSpace Представляет целое число, которое является большим чем нуль. Этот тип данных получен из nonNegativeInteger.

Определённые пользователем простые типы

Получены из встроенных типов, применением к ним именованых ограничений, называемыми аспектами(Facets). Аспекты ограничивают допустимые значения простых типов.

Синтаксис применения аспектов ограничения следующий:

Аспект Значение
Определенный набор значений. Ограничивает тип данных указанными значениями.
Значение с определенным максимальным числом десятичных цифр в дробной части.
Целочисленное число единиц длины. Единицы длины зависят от типа данных.
Верхний предел значений (все значения — меньше указанного).
Максимальное значение.
Целочисленное число единиц максимальной длины.
Нижний предел значений (все значения — больше указанного).
Минимальное значение.
Целочисленное число единиц минимальной длины.
Литеральный шаблон, которому должны соответствовать значения.
Значение с определенным максимальным числом десятичных цифр.
Одно из предопределенных значений: preserve, replace или collapse
Значение Описание
Никакая нормализация не выполняется.
Все #x9 (tab), #xA (line feed) and #xD (carriage return) заменяются на #x20 (пробел).
После replace-обработки все внутренние цепочки #x20 разрушаются до одного пробела, а окружающие пробелы удаляются.

Аспекты могут быть указаны только однажды в определении типа, кроме и — они могут иметь многократные вхождения и группируются.

Именованный тип данных

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

Обратили внимание на ключевое слово в объявлении атрибута? Как и в предыдущих схемах, оно все так же означает обязательность использования объявленного атрибута.

Проверка по схеме XML-файла (валидация по XSD)

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

далее в контексте определения элемента сложного типа мы делаем ограничение на применение атрибутов этой группы:

Сложные типы данных

элемента сложного типа — формальное описание структуры и допустимого содержания элемента, которое используется для проверки правильности XML документа. Модели содержания Схемы предоставляют больший контроль структуры элементов, чем модели содержания DTD. Кроме того, модели содержания схемы позволяют проверять правильность смешанного содержания.

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

Перечень объявлений дочерних элементов приводится в структуре группирующих XSD-элементов choice, sequence, и all.

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

Элемент используется для четкого определения группы и для ссылки к именованной группе. Вы можете использовать модель группы, чтобы определить набор элементов, которые могут быть повторены в документе. Это полезно для формирования определения комплексного типа. Именованную модель группы можно далее определить, используя , или дочерние элементы. Именованные группы должны определяться в корне схемы. При необходимости многократного использования перечня элементов, определенного в группе, не надо каждый раз писать этот перечень — достаточно дать ссылку на именованную группу

Определение элемента сложного типа

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

Листинг 1. Пример XSD-схемы «Картотека.xsd»

.

Практически в каждом проекте, который необходимо интегрировать с другими проектами используется формат передачи данных в виде XML файлов. Каждый программист выбирает для себя наиболее удобное и подходящие для его задач решение по обработки XML файлов. Однако, всегда необходимо помнить о валидации XML файлов. Проверка XML файлов предупредит возможные ошибки и в последствии сэкономит вам и отделу тестирования время. Сегодня я расскажу вам как с помощью Java XML вы сможете проверить XML файл по XSD схеме. Проверка XML по XSD схеме в Java реализуется достаточно просто с помощью библиотеки javax.xml.

Предположим мы хотим передавать из одной системы в другую данные о пользователе.

Предположим, что в наших системах сущность пользователь обладает всего лишь двумя полями: Имя и Фамилия. Эти поля обязательны для заполнения и не могут быть пустыми.

Представим эти правила в виде XSD схемы

И нам надо проверить наши XML файлы на соответствие этому XSD.

Валидация XML документов

Это можно сделать с помощью java.xml. Ниже приведен код, в котором показано каким образом можно сделать проверку в Java. Метод возвращает true or false в зависимости от результата проверки.

Бывает так что необходимо вывести все сообщения об ошибках в XML файле. Это Делается с помощью .

Вы можете включить в свой проект этот утилитарный класс где реализованы некоторые полезные методы для проверки XML по XSD.

Исходники вы можете скачать с GitHub

Проверка XML файлов по XSD из директории META-INF в jar файлах

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*