Валидация (проверка) xml-файла по схеме (xsd) в 1С 8

База знаний
  1. 11 г. назад

    Используется парсер msxml 6, соответственно, целевая платформа - Windows

    &НаКлиентеНаСервереБезКонтекста
    Функция ФорматироватьТекстСообщения(ТекстСообщения)
        
        Возврат ""+ТекущаяДата()+": "+ТекстСообщения+Символы.ПС;
        
    КонецФункции
    
    // Куда = 0 - в сообщения пользователю
    // Куда = 1 - в протокол
    // Куда = 2 - в протокол и в сообщения пользователю
    &НаКлиенте
    Процедура ВывестиСообщение(Сообщ,Куда=1,Форматировать=Ложь)
        
        Если Форматировать Тогда
            ТекСообщ=ФорматироватьТекстСообщения(Сообщ);
        Иначе
            ТекСообщ=Сообщ+Символы.ПС;
        КонецЕсли;
        
        Если (Куда=0) ИЛИ (Куда=2) Тогда
            Сообщить(ТекСообщ,СтатусСообщения.ОченьВажное);
        КонецЕсли;
        Если (Куда=1) ИЛИ (Куда=2) Тогда
            Протокол=Протокол+ТекСообщ;
        КонецЕсли;
        
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ВывестиОшибкуРазбораХМЛ(Ошибка,Куда,Форматировать)
        ВывестиСообщение(" ",Куда,Форматировать);
        ВывестиСообщение("Обнаружена ошибка:",Куда,Форматировать);
        ВывестиСообщение("Смещение = "+Формат(Ошибка.filepos,"ЧГ=0")+", строка = "+Формат(Ошибка.line,"ЧГ=0")+", позиция = "+Формат(Ошибка.linepos,"ЧГ=0")+", код ошибки: "+Формат(Ошибка.errorCode,"ЧГ=0"),Куда,Форматировать);
        ВывестиСообщение("Описание ошибки: "+Ошибка.reason,Куда,Форматировать);
    КонецПроцедуры
    
    &НаКлиенте
    Функция ПроверкаПоСхемеКлиент(ИмяФайла,ИмяФайлаСхемы,ВыводитьВсеОшибки=Истина)
        
        Куда=1;	Форматировать=Ложь;
        
        РезПроверки=Ложь;
        
        Если Не ЗначениеЗаполнено(ИмяФайла) Тогда
            Возврат РезПроверки;
        КонецЕсли;
        
        Если НЕ ЗначениеЗаполнено(ИмяФайлаСхемы) Тогда
            // Не удалось извлечь файл схемы
            Возврат РезПроверки;
        КонецЕсли;
        
        Попытка
            Схема=Новый COMОбъект("MSXML2.XMLSchemaCache.6.0");
        Исключение
            ВывестиСообщение("Не удалось создать объект XMLSchemaCache (возможно, не установлен MSXML 6)",2);
            Возврат РезПроверки;
        КонецПопытки;
        
        Попытка
            Схема.add("",ИмяФайлаСхемы);
        Исключение
            ВывестиСообщение("Не удалось подключить схему: "+ИмяФайлаСхемы,2);
            Схема=Неопределено;
            Возврат РезПроверки;
        КонецПопытки;
        
        Попытка
            ДОМ=Новый COMОбъект("MSXML2.DOMDocument.6.0");
        Исключение
            ВывестиСообщение("Не удалось создать объект DOMDocument (возможно, не установлен MSXML 6)",2);
            Схема=Неопределено;
            Возврат РезПроверки;
        КонецПопытки;
        
        ДОМ.schemas=Схема;
        ДОМ.async=Ложь;
        ДОМ.validateOnParse=Истина;
        ДОМ.resolveExternals=Истина;
        Если ВыводитьВсеОшибки Тогда
            ДОМ.SetProperty("MultipleErrorMessages",Истина);
        КонецЕсли;
        ДОМ.load(ИмяФайла);
        
        Если (ДОМ.parseError.errorCode<>0) Тогда
            // ошибки при проверке правильности
            ВывестиСообщение("При проверке по схеме выявлены ошибки!",Куда,Форматировать);
            Если ВыводитьВсеОшибки Тогда
                Для каждого parseError из ДОМ.parseError.AllErrors  Цикл
                    ВывестиОшибкуРазбораХМЛ(parseError,Куда,Форматировать);
                КонецЦикла;
            Иначе
                ВывестиОшибкуРазбораХМЛ(ДОМ.parseError,Куда,Форматировать);
            КонецЕсли;
        Иначе
            ВывестиСообщение("Файл успешно прошёл проверку по схеме!",Куда,Форматировать);
            РезПроверки=Истина;
        КонецЕсли;
        
        Схема=Неопределено;
        ДОМ=Неопределено;
        
        Возврат РезПроверки;
        
    КонецФункции
    
    
  2. 05.02.2014 22:10:30 отредактировано andrewks

    Обработка проверки по схеме XML-файла (валидация по XSD)

    Довольно часто возникает необходимость проверки соответствия XML-файлов представленной схеме (XSD), но под рукой не оказывается программы, обладающей этим функционалом. Представляемая Вашему вниманию обработка очень компактна, не требует установки, и позволяет справиться с этой задачей в среде 1С:Предприятие 8.2 и выше под Windows.

    Системные требования: необходимо наличие служб MSXML 6.0. Во всех современных версиях Windows (начиная с Vista и позже) они присутствуют после установки. Если же версии Windows старые (XP/2003), тогда может понадобиться их установка (взять можно здесь ), но, скорее всего, даже на этих версиях Windows они уже установлены, если система периодически обновляется. Так что рекомендую сначала попробовать обработку, и только в случае неудачи устанавливать службы MSXML 6.0.

    ВалидацияXML.zip

или зарегистрируйтесь чтобы ответить!