Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
Приветствую!

1. Есть задача наладить взаимодействие программ с помощью XML.
2. Как имея схему XSD проверять XML схеме я умею.
3. Не пойму, как проверять саму схему на корректность. Свои схемы придется создавать весьма активно.
4. Ниже код, в комментариях сказано, что не получается сделать и какие ошибки выводятся. Код почти готовый, только, возможно, самому придется импортировать msxml6.dll (мне пришлось, т.к. у меня Delphi2007).
5. Вопрос, как проверить саму схему XML (т.е. не XML по схеме, а саму схему)?


uses
   MSXML2_TLB; // сам импортировал msxml6.dll

function CreateXMLDoc(const aProhibitDTD: Boolean): IXMLDOMDocument2;
begin
   Result := CoDOMDocument60.Create();
   Result.async := False;
   Result.validateOnParse := False;
   Result.setProperty('ResolveExternals', False);
   Result.setProperty('ProhibitDTD', aProhibitDTD);
   Result.setProperty('UseInlineSchema', False);
   Result.setProperty('MultipleErrorMessages', True);
end;

procedure ValidateSchema();
var
   kFileName_XSD: String;
   kXMLSchema: IXMLDOMSchemaCollection2;
   kXMLDoc: IXMLDOMDocument2;
   kXMLSchemaDoc: IXMLDOMDocument2;
   kXMLDOMParseError2: IXMLDOMParseError2;
begin
   // Скачено отсюда http://www.w3.org/2001/XMLSchema.xsd
   kFileName_XSD := 'e:\Temp\__SuperTemp\XMLSchema.xsd';

   kXMLSchemaDoc := CreateXMLDoc(False{aProhibitDTD});
   kXMLSchemaDoc.load(kFileName_XSD);
   // NB для краткости примера опущена обработка kXMLSchemaDoc.parseError

   kXMLSchema := CoXMLSchemaCache60.Create();

   // ВАРИАНТ 1. Если написать:
   kXMLSchema.add('', kXMLSchemaDoc);
   // , то будет ошибка:
   // <<
   // XMLSchema.xsd#/schema/targetNamespace[1]
   // Указанное пространство имен "" отличается от targetNamespace "http://www.w3.org/2001/XMLSchema" схемы.
   // >>

   // ВАРИАНТ 2. Если написать:
   kXMLSchema.add('http://www.w3.org/2001/XMLSchema', kXMLSchemaDoc);
   // , то будет ошибка:
   // <<
   // XMLSchema.xsd#/schema/element[1][@name = 'schema']/complexType[1]/complexContent[1]/extension[1]/attribute[8]
   // Необъявленный атрибут XSD: "{http://www.w3.org/XML/1998/namespace}lang"
   // >>

   (* Далее хотел делать это, но до этого дело не должно, т.к. ошибка выше
   kXMLDoc := CreateXMLDoc(True{aProhibitDTD});
   kXMLDoc.load('...');
   kXMLDoc.schemas := kXMLSchema;
   kXMLDOMParseError2 := kXMLDoc.validate as IXMLDOMParseError2;
   // анализ kXMLDOMParseError2*)
end;
15 мар 20, 17:01    [22099434]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
Для любой схемы можно сделать схему.. и так пока не надоест)))
Вам проверить на синтаксис или на логику?
15 мар 20, 21:36    [22099528]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
X-Cite,

Написал я свою схему в текстовом редакторе.
Сохранил ее в файле с расш. XSD.
Хочу проверить, что сохраненный файл является схемой.
15 мар 20, 21:52    [22099537]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
https://www.w3.org/2012/04/XMLSchema.xsd
15 мар 20, 22:03    [22099540]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
X-Cite,

Что-то разницы не вижу(((
Всё равно выдает:

XMLSchema_2012.xsd#/schema/element[1][@name = 'schema']/complexType[1]/complexContent[1]/extension[1]/attribute[10]
Необъявленный атрибут XSD: "{http://www.w3.org/XML/1998/namespace}lang"

Может как-то http://www.w3.org/XML/1998/namespace отдельно подключать (строка 86 в предложенном файле)?

Или я вообще не верно всё понимаю с проверкой схем?

Сообщение было отредактировано: 15 мар 20, 23:14
15 мар 20, 23:15    [22099563]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
Добавьте все схемы в коллекцию...

По идее еще эта нужна...

https://www.w3.org/2001/03/xml.xsd
16 мар 20, 01:48    [22099584]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
X-Cite,

Проблема таки есть.
В интернетах пишут примерно об этом, что свою схему невозможно проверить с помощью XMLSchema.xsd.

Написал на JS аналог (чтобы Delphi народ не пугался).
Задал вопрос. Поглядим.
https://stackoverflow.com/questions/60704921/how-to-validate-my-own-schema-xsd-file-againts-xmlschema-xsd-using-msxml
16 мар 20, 14:15    [22099915]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
Dimitry Timokhov
Написал я свою схему в текстовом редакторе.
Сохранил ее в файле с расш. XSD.
Не делайте так. Создавайте схемы в XML редакторе. Кроме того, что там встроенная валидация, так еще и гораздо удобнее писать код.

А так вот код на JScript, который отвалидирует схему
+
var schemaCache = new ActiveXObject("MSXML2.XMLSchemaCache.6.0");

var schemaSource = new ActiveXObject ( "MSXML2.DOMDocument.6.0" );
schemaSource.async = false;
schemaSource.validateOnParse = false;
schemaSource.setProperty("ResolveExternals", true); 

// load the schema document
if (schemaSource.load('myschema.xsd')) {
   try
  {
    // Set up XPath
    schemaSource.setProperty ( "SelectionLanguage", "XPath" );
    schemaSource.setProperty ( "SelectionNamespaces", "xmlns:a='http://www.w3.org/2001/XMLSchema'" );

    // extract the targetNamespace attribute from the schema using XPath
    var tnsattr = schemaSource.selectSingleNode ( "/a:schema/@targetNamespace" );
    var nsuri = (tnsattr) ? tnsattr.nodeValue : '';

    // add the schema to the cache
    schemaCache.add ( nsuri, schemaSource );
    WScript.echo("OK");
  }
  catch ( e )
  {
    WScript.echo ( "Exception adding schema to cache" );
    WScript.echo ( e.description );
  }
} else {
   WScript.echo("Schema error");
   WScript.echo("### error: " + schemaSource.parseError.reason);
   WScript.echo("### source: " + schemaSource.parseError.srcText);
   WScript.echo("### line: " + schemaSource.parseError.line);
}
16 мар 20, 16:03    [22100003]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
_Vasilisk_,

1. Гениально! Елки, я просто безмерно рад. Мне в голову не приходило, что у класса "MSXML2.XMLSchemaCache.6.0" метод add проверяет схему!!! Т.е. не додумался подсунуть этому методу заведомо ошибочную схему.
Всё хотел проверить свою схему через схему схем XMLSchema.xsd.
Т.е. хотел проверить свою схему как обычный XML через схему XMLSchema.xsd.
Спасибо!

2. Я тоже дошел до того, что лучше писать в редакторе схемы. Скачал XMLPad. Разбираюсь.
16 мар 20, 21:36    [22100206]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
_Vasilisk_,

1. Начал разбираться с Вашим кодом (по части "var tnsattr = schemaSource.selectSingleNode ( "/a:schema/@targetNamespace" );", остальное понятно).
Понял, что вообще не понимаю, что такое эти namespace'ы.

Спасибо https://www.liquid-technologies.com/xml-schema-tutorial/xsd-namespaces и https://xmlpad-mobile.com/
Чуть разобрался. Всем советую, кто совсем нуб в теме namespace'ов.
Там, правда, ошибки у них есть в примере, но не страшно - как раз скилы прокачать, поняв проблему.
Но в целом прочищает мозг.

2. Собственно вот, что спросить хотел.
Посоветуйте, пожалуйста, талмуд, после которого тему XML (XPath, преобразований и пр.) можно считать закрытой. Есть такой "Руссинович" или "Дейт", но по XML?
Спасибо!
17 мар 20, 03:06    [22100295]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
Dimitry Timokhov
(XPath, преобразований и пр.)
90% закрывает MSDN или W3School. Остальное - форумы
17 мар 20, 16:58    [22100782]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 71
_Vasilisk_,

1. Спасибо. Буду копать.
2. Каким сами редактором пользуетесь для XML и XSD?
17 мар 20, 21:01    [22100941]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11602
Dimitry Timokhov
Каким сами редактором пользуетесь для XML и XSD?
Oxygen XML Editor:
  • фолдинг
  • форматтер
  • validation
  • code completion (в том числе и на основании XSD схемы)
  • xslt debugger
17 мар 20, 21:30    [22100958]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить саму схему XML на соответствие схеме  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
Dimitry Timokhov
_Vasilisk_,

1. Спасибо. Буду копать.
2. Каким сами редактором пользуетесь для XML и XSD?

Мне хватает Visual Studio 2019.. Она тоже умеет и валидировать и IntelliSense и генерировать и xslt и дебажить xslt, в общем все)
17 мар 20, 22:11    [22100969]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить