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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2015, 13:33   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Проверка XML по XSD

Здравствуйте.
Только начал разбираться с проверкой XML по XSD.
Наше много примеров в сети. Вроде все понятно, но только один момент. Вот код
Код:
procedure TfrmMain.btnValidateClick(Sender: TObject);
var
  vXMLParserError: IXMLDOMParseError;
  vXMLSchema: IXMLDOMSchemaCollection2;
  vXMLDoc: IXMLDOMDocument3;
  vXMLSchemaDoc: IXMLDOMDocument3;
  vStrs: TStringList;
begin
  vStrs := TStringList.Create();
  try
    //Загрузка схемы
    vXMLSchema := CoXMLSchemaCache60.Create();
    vXMLSchemaDoc := CoDOMDocument60.Create();
    vStrs.LoadFromFile( 'c:\temp\Declarant_Alko.xsd4302.11-o430.xsd' );
    vXMLSchemaDoc.loadXML( vStrs.Text );
    if vXMLSchemaDoc.parseError.errorCode <> 0 then
      begin
        ShowMessage(Format('Ошибка при загрузке схемы <%s: %s>', [vXMLSchemaDoc.parseError.reason, vXMLSchemaDoc.parseError.srcText]));
        Exit;
      end;
    vXMLSchema.add('', vXMLSchemaDoc);
    //Загрузка документа
    vXMLDoc := CoDOMDocument60.Create();
    vXMLDoc.async := False;
    vXMLDoc.resolveExternals := false;
    vXMLDoc.validateOnParse := false;
    vStrs.Clear();
    vStrs.LoadFromFile( 'c:\temp\R1_6109001892_095_09102015_DA268A53-98DD-4486-A820-3BC42F109D38.XML' );
    vXMLDoc.loadXML( vStrs.Text );
    vXMLDoc.schemas := vXMLSchema;
    vXMLParserError := vXMLDoc.validate;
    Memo1.Clear;
    if vXMLParserError.errorCode <> 0 then
      Memo1.Lines.Add(Format('Ошибка при валидации <Причина: %s; Текст: %s; Код: %d>', [Trim(vXMLParserError.reason), 
vXMLParserError.srcText, vXMLParserError.errorCode]))
    else
      ShowMessage( 'Валидация документа проша успешно' );
  finally
    FreeAndNil( vStrs );
  end;
end;
Этот код показывает, только одну ошибку, на которую первую попадает, а как сделать так, чтобы он проверил весь файл и выдал все ошибки будь их хоть 100

Последний раз редактировалось tarakan1983; 09.10.2015 в 14:03.
tarakan1983 вне форума Ответить с цитированием
Старый 09.10.2015, 13:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Судя по MSDN у IXMLDOMParseError нет коллекции, а стало быть он вернет только первую ошибку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2015, 14:02   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Судя по MSDN у IXMLDOMParseError нет коллекции, а стало быть он вернет только первую ошибку.
А какой тогда выход?

Последний раз редактировалось tarakan1983; 09.10.2015 в 14:09.
tarakan1983 вне форума Ответить с цитированием
Старый 09.10.2015, 14:17   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не знаю. Я не использовал проверку по схемам. Тут у мну познания скудные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2015, 15:57   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
Судя по MSDN у IXMLDOMParseError нет коллекции, а стало быть он вернет только первую ошибку.
Есть у второй версии этого интерфейса, я уже не помню, как его правильно использовать. Вроде бы приведением типа, ли же запросом IID другой версии у предка или ноды.
Ну и у XML/схемы вроде бы есть свойство остановки парсера на первой же ошибке.

Последний раз редактировалось Человек_Борща; 09.10.2015 в 16:00.
Человек_Борща вне форума Ответить с цитированием
Старый 09.10.2015, 18:58   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Спасибо за наводку со второй версией.
Кому интересно вот сырой рабочий код, взятый с королевства Delphi.
Красоту, кому надо наводите сами.
Код:
procedure TfrmMain.btnValidateClick(Sender: TObject);
var
  vXMLParserError: IXMLDOMParseError2;
  vXMLSchema: IXMLDOMSchemaCollection2;
  vXMLDoc: IXMLDOMDocument2;
  vXMLSchemaDoc: IXMLDOMDocument2;
  vStrs: TStringList;
  CodError:IXMLDOMParseErrorCollection;
   i : Integer;
begin
  vStrs := TStringList.Create();
  try
    //Загрузка схемы
    vXMLSchema := CoXMLSchemaCache60.Create();
    vXMLSchemaDoc := CoDOMDocument60.Create();
    vStrs.LoadFromFile( 'c:\temp\Declarant_Alko.xsd4302.11-o430.xsd' );
    vXMLSchemaDoc.loadXML( vStrs.Text );
    if vXMLSchemaDoc.parseError.errorCode <> 0 then
      begin
        ShowMessage(Format('Ошибка при загрузке схемы <%s: %s>', [vXMLSchemaDoc.parseError.reason, vXMLSchemaDoc.parseError.srcText]));
        Exit;
      end;
    vXMLSchema.add('', vXMLSchemaDoc);
//Загрузка документа
    vXMLDoc := CoDOMDocument60.Create();
    vXMLDoc.async := False;
    vXMLDoc.resolveExternals := false;
    vXMLDoc.validateOnParse := false;
    vXMLDoc.setProperty('MultipleErrorMessages',true);
    vStrs.Clear();
    vStrs.LoadFromFile( 'c:\temp\R1_6109001892_095_09102015_DA268A53-98DD-4486-A820-3BC42F109D38.XML' );
    vXMLDoc.loadXML( vStrs.Text );
    vXMLDoc.schemas := vXMLSchema;
    vXMLParserError := vXMLDoc.validate as IXMLDOMParseError2;
    Memo1.Clear;
    if vXMLParserError.errorCode <> 0 then
      begin
         CodError := vXMLParserError.allErrors;
         for I := 0 to CodError.length-1 do
        begin
        Memo1.Lines.Add(CodError.item[i].reason);
        Memo1.Lines.Add('*****');
        end;
      end
    else
      ShowMessage( 'Валидация документа проша успешно' );
  finally
    FreeAndNil( vStrs );
  end;
end;
tarakan1983 вне форума Ответить с цитированием
Старый 10.10.2015, 09:01   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мне всегда было интересно,зачем микрософт разбивал функционал на кучу интерфейсов? Даже исходя из соображений совместимости не обязательно было это делать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверить XML на соответствие схеме XSD LISTAT Общие вопросы Delphi 0 24.09.2012 14:22
Макрос создания xml по схеме xsd tae1980 Microsoft Office Excel 4 01.07.2012 21:48
xsd and xml bpystep Помощь студентам 4 27.12.2010 20:02
how can i create xml document from xsd sxhema orter PHP 1 04.10.2010 20:03