Как проверить XML документ по схеме (провести валидацию)

Автор:Izmajlov
Дата:17.06.2014
Просмотров:6456
Скачиваний:2415
Оценка:, Оценок - 3
Сохранить в файле

Обсудить в форуме

Описание

С переводом обмена с НО и ЦБ на XML формат, стала актуальна процедура проверки сформированного файла на соответствие схеме данных (XSD)
Привожу пример проверки по схемам обмена с ФНС (открытие/закрытие счетов (депозитов), изм.реквизитов..
Особенность примера в том, что обрабатываются сразу ВСЕ обнаруженные ошибки, а не по одной..
Пример без кода формирования самого XML-файла,а только подготовка и проведение ВАЛИДАЦИИ

Текст примера

 
Schema = TlgActiveX("Msxml2.XMLSchemaCache.6.0");
doc=TlgActiveX("MSXML2.DOMDocument.6.0");
doc.async = False;
doc.validateOnParse = true;
/***********************************************/
/* Пропускаю код формирования doc - XML-файла. */
/***********************************************/

xsd = TlgActiveX("MSXML2.DOMDocument.6.0");
xsd.async = False;
/*****************************************/
/*  Для загрузки ТОЛЬКО одной схемы      */
/*  Добавить свои условия - IF ELIF ELSE */
/*****************************************/

/**************************************/
/* сообщение Банка по счету(депозиту) */
/**************************************/
/* Открытие/закрытие счета, вклада(депозита) */
xsd.load("\\\\Server\\Share\\RSBANK\\UserDir\\Mac\\311-P\\Schem\\SBC0_510.xsd");

/* Изменение реквизитов счета, вклада(депозита) */
//xsd.load("\\\\Server\\Share\\RSBANK\\UserDir\\Mac\\311-P\\Schem\\SBC1_510.xsd");

/* Изменение реквизитов счета, вклада(депозита), в связи с реорг.банка */
//xsd.load("\\\\Server\\Share\\RSBANK\\UserDir\\Mac\\311-P\\Schem\\SBC3_510.xsd");

/***************************/
/* Сообщение Банка по КЭСП */
/***************************/
/* Разрешение/прекращение права на исп. КЭСП для переводов ЭДС. п.10 */
//xsd.load("\\\\Server\\Share\\RSBANK\\UserDir\\Mac\\311-P\\Schem\\SKD0_510.xsd");

/* Изменение реквизитов КЭСП. п.11 */
//xsd.load("\\\\Server\\Share\\RSBANK\\UserDir\\Mac\\311-P\\Schem\\SKD1_510.xsd");

/* Изменение реквизитов счета, вклада(депозита), КЭСП в связи с реорг.банка. п.9 */
//xsd.load("\\\\Server\\Share\\RSBANK\\UserDir\\Mac\\311-P\\Schem\\SBC3_510.xsd");

Schema.add("",xsd);

/* Добавляем к XMLфайлу схему */
doc.Schemas = Schema;
/* Важная инструкция!!!! */
doc.setProperty("MultipleErrorMessages",True);
/**************************************************/
/* doc - сформированный XML-файл, на этом этапе   */
/* можно пока без сохранения на диск, т.е. файл   */
/* находится в памяти. Проверяем ,если без ошибок */
/* то сохраняем на диск.                          */
/**************************************************/


err = doc.validate();
/* Есть ошибки заполнения */
/* Печатаем  протокол с содержимым */
if(err.errorCode!=0)
	/* Перенаправляем вывод в файл */
	setOutput(fname);
	allErr = err.allErrors;
	allErr.reset();
	i=0;
	[****************************************************];
	[ #](String(Date:f)+" "+string(Time:f));
	[ Протокол контроля правильности заполнения XML файла];
	[****************************************************];
	While(allErr.next)
		reason = allErr.item(i).reason;
		reason = strSubst(reason,"\n","");
		reason = strSubst(reason,"\r","");
		println(reason);
		i=i+1;
	end;
	setOutput(null);
	if(open(out,fname))
		ViewFile(Out);
     	       Close(Out);
	end;
else	
	/* Ошибок НЕТ, можно сохранять */
	fNameXML = PrefixR+PrefixX+PrefixA+idBank+"_"+idNO+DateFile+"_"+NumberBank+NumberFilial+GG+NumberMessage+"_"+Sharp+MM+".xml";
	doc.save(PathToSave +"\\"+ fNameXML);
end;