Имя: Пароль:
1C
1С v8
Проверка файла XML по схеме
0 NikePopov
 
19.06.13
09:10
Добрый день, Коллеги.
Столкнулся с следующей проблеммой
Задача:
Проверить XML-файл на валидность по схеме
Текущее решение:
Функция ПолучитьСхему()
ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("xsd");
ДвоичныеДанныеСхемы = ПолучитьМакет("Схама");
ДвоичныеДанныеСхемы.Записать(ИмяФайлаСхемы);

ЧтениеXMLСхемы = Новый ЧтениеXML;
ЧтениеXMLСхемы.ОткрытьФайл(ИмяФайлаСхемы);

ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXMLСхемы);
ЧтениеXMLСхемы.Закрыть();

ПостроительСхемыXML = Новый ПостроительСхемXML;
СхемаXML = ПостроительСхемыXML.СоздатьСхемуXML(ДокументDOM);
УдалитьФайлы(ИмяФайлаСхемы);
Возврат СхемаXML;
КонецФункции // ПолучитьСхему()

Функция ПроверитьФайлДанных(АдресФайлаДанныхВоВременномХранилище) Экспорт
Результат = Истина;
Если АдресФайлаДанныхВоВременномХранилище = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось загрузить файл!";
Сообщение.Поле = "Объект.ФайлДанных";
Сообщение.Сообщить();
Возврат Ложь;
КонецЕсли;
// Имена Файлов
ИмяПроверяемгоФайлаДанных = ПолучитьИмяВременногоФайла("xml");
// Создание файлов
ДвоичныеДанныеФайлаДанных = ПолучитьИзВременногоХранилища(АдресФайлаДанныхВоВременномХранилище);
ДвоичныеДанныеФайлаДанных.Записать(ИмяПроверяемгоФайлаДанных);
// Проверка на валидность
СхемаXML = ПолучитьСхему();
Если СхемаXML = Неопределено Тогда
Возврат Ложь;
КонецЕсли;

НаборСхем = Новый НаборСхемXML;
НаборСхем.Добавить(СхемаXML);
ПараметрыЧтенияXML = Новый ПараметрыЧтенияXML( , , , ТипПроверкиXML.СхемаXML);
Чтение = Новый ЧтениеXML;
Попытка
Чтение.ОткрытьФайл(ИмяПроверяемгоФайлаДанных, ПараметрыЧтенияXML, НаборСхем); //если файл не соответствует схеме (НЕ РАБОТАЕТ - СХЕМА ВСЕГДА ВАЛИДНА)
Исключение
Сообщить("Схема не прошла проверку на валидность!", СтатусСообщения.ОченьВажное);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Информация);
Возврат Ложь;
КонецПопытки;
// Удаляем созданные файлы
УдалитьФайлы(ИмяПроверяемгоФайлаДанных);
Возврат Результат;
КонецФункции // ПроверитьФорматФайлаДанных()
Текст ошибки:
{ВнешняяОбработка.Загрузка.МодульОбъекта(45)}: Ошибка при вызове метода контекста (ОткрытьФайл): Ошибка совместного доступа к файлу 'C:\Users\...\AppData\Local\Temp\v8_1E7C_153.tmp'
Текст строки с ошибкой:
Чтение.ОткрытьФайл(ИмяПроверяемгоФайлаДанных, ПараметрыЧтенияXML, НаборСхем);
Комментарий:
В файле 'C:\Users\...\AppData\Local\Temp\v8_1E7C_153.tmp' содержится содержимое схемы XML. Предполагаю, что ЧтениеXMLСхемы держит файл ИмяФайлаСхемы пока не очистится НаборСхем, а при выполнении метода ОткрытьФайл пытается его захватить ещё раз. Ошибка исчезает, если у процедуры ОткрытьФайл убрать третий параметр, но тогда не произойдёт проверка файла данных на валидность. Может есть какой-то другой вариант проверки или идея как исправить этот?