|
Проверка файла 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Схемы держит файл ИмяФайлаСхемы пока не очистится НаборСхем, а при выполнении метода ОткрытьФайл пытается его захватить ещё раз. Ошибка исчезает, если у процедуры ОткрытьФайл убрать третий параметр, но тогда не произойдёт проверка файла данных на валидность. Может есть какой-то другой вариант проверки или идея как исправить этот? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |