Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2016, 18:04   #1
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию разделенная XSD

Добрый день подскажите как проверить XML если XSD разделена на несколько частей.
xsd21a.7z

Проверяю так


Код:

function ValidateXMLByXSD(sXMLFile:string; sXSDFile:string; Errors:TStrings):Boolean;
var
 oXML,oXSD,oXMLCheck:IXMLDOMDocument3; //IXMLDOMDocument3 for XML 6.0
 oCache:IXMLDOMSchemaCollection2;  // IXMLDOMSchemaCollection2 for XML 6.0
 errcol:IXMLDOMParseErrorCollection;
 err:IXMLDOMParseError2;
 i:Integer;
begin
  Result := False;
  oXML := CoDOMDocument60.Create;
  oXSD := CoDOMDocument60.Create;
  oXMLCheck := CoDOMDocument60.Create;
  oXML.setProperty('MultipleErrorMessages', true);
  oXSD.setProperty('MultipleErrorMessages', true);
  oXMLCheck.setProperty('MultipleErrorMessages', true);
  oCache := CoXMLSchemaCache60.Create;
  if oXML.load(sXMLFile) then
  begin
     oXSD.async := false;
     oXSD.validateOnParse := true;
     if oXSD.load(sXSDFile) then
     begin
       try
        oCache.add(oXML.documentElement.namespaceURI,oXSD);
       except
         on E:Exception do
         begin
          Errors.Add(E.Message);
          Result := False;
          exit;
          end;
       end;
       oXMLCheck.schemas:=oCache;
       Result := oXMLCheck.loadXML(oXML.xml);
       if not Result then
       begin
    err := (oXMLCheck.parseError as IXMLDOMParseError2);
    errcol := err.allErrors;
    for i:=0 to errcol.length -1 do
    begin
     Errors.Add(Format('Ошибка при валидации <Позиция в файле: %s; Причина: %s; Код: %d>',
          [errcol.item[i].errorXPath, Trim(errcol.item[i].reason), errcol.item[i].errorCode]));
    end;
       end;
     end
Ошибку выдаёт
Цитата:
oplist.xsd#/schema/complexType[1][@name = 'OPLIST']/attributeGroup[1]
attributeGroup "FILEHEAP" - не определено
Подскажите куда копать. Или пошлите туда где пример есть.

Ошибка на этой строчке
Код:
oCache.add(oXML.documentElement.namespaceURI,oXSD);
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)

Последний раз редактировалось BARNEY; 21.10.2016 в 10:30.
BARNEY вне форума Ответить с цитированием
Старый 21.10.2016, 13:01   #2
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

Переформулирую вопрос,
как сделать проверку по XSD схеме в которой есть
Код:
<xsd:include schemaLocation="prz_types.xsd"/>
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 26.10.2016, 17:42   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

При include надо обязательно указывать пространство имен к которому принадлежит импортируемый файл. В ЛС ответил доплнительно.
Человек_Борща вне форума Ответить с цитированием
Старый 23.05.2018, 12:44   #4
V_Paniker
Новичок
Джуниор
 
Регистрация: 21.05.2018
Сообщений: 1
По умолчанию

Столкнулся недавно с такой же проблемой. Решения не нашел, придумал такое. Может кому поможет.

Смысл в том, чтобы добавить в переменную IXMLDOMSchemaCollection2 все схемы которые инклудятся в текущей схеме. Для этого написал процедуру в нее передаем переменную и путь к файлу xsd.
Код:
procedure addSchemas(var xmlSchemas:IXMLDOMSchemaCollection2;xsdFilePath: string);
var
 strList: TStringList;
 root,node:IXMLNode;
 xsdDoc:IXMLDOMDocument3;
 xmlDoc:IXMLDocument;
begin
  strList:= TStringList.Create();
  xmlDoc:=TXMLDocument.Create(nil);
  xsdDoc := CoDOMDocument60.Create();
  if not FileExists(xsdFilePath) then
  begin
    ShowMessage(Format('Не найдена XSD схема (%s)! ',[xsdFilePath]));
    exit;
  end;

  strList.LoadFromFile(xsdFilePath);
  xsdDoc.loadXML(strList.Text );

  //проверяем корректность схемы
  if xsdDoc.parseError.errorCode <> 0 then
  begin
      ShowMessage(Format('Некорректная схема <%s.  %s: %s>', [xsdFilePath,xsdDoc.parseError.reason, xsdDoc.parseError.srcText]));
      Exit;
  end;
  //Добавляем схему в коллекцию
  xmlSchemas.add('', xsdDoc);

  //Дальше ищем в схеме инклуды
  //и по ним запускаем эту же процедуру
  xmlDoc.FileName:=xsdFilePath;
  xmlDoc.Active:=true;
  root:=xmlDoc.ChildNodes.FindNode('xs:schema');
  node:=root.ChildNodes.First;

  while node<>nil do
  begin
    if node.NodeName='xs:include' then
    begin
      addSchemas(xmlSchemas,ExtractFilePath(xsdFilePath)+node.Attributes['schemaLocation']);
    end;
    node:=node.NextSibling;
  end;
  xmlDoc.Active:=false;
end;
Перед запуском отключаем валидацию при загрузке, чтобы не ругался на еще незагруженные xsd

Код:
vXMLSchema.validateOnLoad := false;
    addSchemas(vXMLSchema,xsdpath);
    vXMLSchema.validate;
V_Paniker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычислить методом прогонки область, разделенная на 3 части RAEman Помощь студентам 0 08.12.2013 20:21
Разделенная БД КВВ Microsoft Office Access 1 26.06.2012 21:45
Разделенная форма в подчиненной форме s8259 Microsoft Office Access 0 27.09.2011 00:45
Разделенная форма в 2003 офисе Манжула Богдан Microsoft Office Access 3 07.01.2010 18:31