воскресенье, 25 августа 2024 г.

Проверка XML-файла на соответствие схеме

Дано: Большой XML-файл, при попытке загрузить через SSIS в базу SQL падает с неинформативной ошибкой. Доступа к ETL-проекту нет. Надо найти ошибку.

Решение:

// 7.7

Процедура Сформировать()

    Анализатор = СоздатьОбъект("AddIn.XMLParser");
    ДокДляПроверки = Анализатор.СоздатьДокумент();

    Схемы = Анализатор.СоздатьКоллекциюСхем();
    Схемы.ДобавитьСхему("", "полный путь и имя файла.xsd");
    ДокДляПроверки.Схемы = Схемы;

    Попытка
        ДокДляПроверки.Загрузить("полный путь и имя файла.xml" );
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    
КонецПроцедуры

 

//8.x - https://forum.infostart.ru/forum9/topic71808/

Процедура ВалидацияXML(ПутьКФайлуXML, ПутьКФайлуСхемы)
    
    // Читаем схему и записываем её в объектную модель документа (DOM).
    ЧтениеXML_ = Новый ЧтениеXML;
    ЧтениеXML_.ОткрытьФайл(ПутьКФайлуСхемы);
    ПостроительDOM_ = Новый ПостроительDOM;
    ДокументDOM_ = ПостроительDOM_.Прочитать(ЧтениеXML_);
    ЧтениеXML_.Закрыть();

    // Для построения схемы получаем корневой элемент документа.
    КорневойЭлементДокумента_ = ДокументDOM_.documentElement;

    // Для создания схемы используем построитель схем.
    ПостроительСхем_ = Новый ПостроительСхемXML;
    // Cоздаем схему.
    СхемаXML_ = ПостроительСхем_.СоздатьСхемуXML(КорневойЭлементДокумента_);

    // Теперь нужно обновить DOM схемы, иначе действия с тегами <xs:import> и <xs:include>
    // не будут учтены. 
    // Для этого просто удалим документ DOM.
    СхемаXML_.ДокументDOM = Неопределено;

    // Добавляем схему в набор.
    НаборСхем_ = Новый НаборСхемXML;
    НаборСхем_.Добавить(СхемаXML_);

    // Проверим, что набор схем корректен.
    НаборСхем_.Проверить();

    // Теперь прочитаем XML, с учетом набора схем.
    ЧтениеXML_ = Новый ЧтениеXML;
    ПараметрыЧтенияXML_ = Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.СхемаXML);
    ЧтениеXML_.ОткрытьФайл(ПутьКФайлуXML, ПараметрыЧтенияXML_, НаборСхем_);
    
    // При вызове метода Прочитать() выполняется валидация файла XML по схеме.
    ЧтениеXML_.Прочитать();
    ЧтениеXML_.Закрыть();
    
КонецПроцедуры

 

Комментариев нет: