powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить саму схему XML на соответствие схеме
14 сообщений из 14, страница 1 из 1
Как проверить саму схему XML на соответствие схеме
    #39937616
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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;
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937660
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для любой схемы можно сделать схему.. и так пока не надоест)))
Вам проверить на синтаксис или на логику?
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937666
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite,

Написал я свою схему в текстовом редакторе.
Сохранил ее в файле с расш. XSD.
Хочу проверить, что сохраненный файл является схемой.
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937668
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937680
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 в предложенном файле)?

Или я вообще не верно всё понимаю с проверкой схем?
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937691
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте все схемы в коллекцию...

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

https://www.w3.org/2001/03/xml.xsd
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937839
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite,

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

Написал на JS аналог (чтобы Delphi народ не пугался).
Задал вопрос. Поглядим.
https://stackoverflow.com/questions/60704921/how-to-validate-my-own-schema-xsd-file-againts-xmlschema-xsd-using-msxml
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39937882
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Timokhov
Написал я свою схему в текстовом редакторе.
Сохранил ее в файле с расш. XSD.
Не делайте так. Создавайте схемы в XML редакторе. Кроме того, что там встроенная валидация, так еще и гораздо удобнее писать код.

А так вот код на JScript, который отвалидирует схему
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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);
}

...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39938020
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

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

2. Я тоже дошел до того, что лучше писать в редакторе схемы. Скачал XMLPad. Разбираюсь.
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39938057
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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?
Спасибо!
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39938363
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Timokhov
(XPath, преобразований и пр.)
90% закрывает MSDN или W3School. Остальное - форумы
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39938459
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

1. Спасибо. Буду копать.
2. Каким сами редактором пользуетесь для XML и XSD?
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39938462
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Timokhov
Каким сами редактором пользуетесь для XML и XSD?
Oxygen XML Editor:
  • фолдинг
  • форматтер
  • validation
  • code completion (в том числе и на основании XSD схемы)
  • xslt debugger
...
Рейтинг: 0 / 0
Как проверить саму схему XML на соответствие схеме
    #39938469
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Timokhov
_Vasilisk_,

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

Мне хватает Visual Studio 2019.. Она тоже умеет и валидировать и IntelliSense и генерировать и xslt и дебажить xslt, в общем все)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить саму схему XML на соответствие схеме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]