Работа с xml-файлами при помощи msxml в 1С 7.7

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

    прямая работа с xml через msxml-парсер даёт дополнительные бонусы по сравнению с v7plus.dll:
    1. меньше глюков и проблем, больше управляемости и возможностей (v7plus.dll представляет собой лишь обёртку, которая так же в итоге обращается к парсеру msxml, но при этом имеет кучу ограничений: не все версии парсера подхватывает, не работает с комментариями и CDATA, и т.п.)
    2. привычный набор свойств и методов для тех, кто уже знаком с объектной моделью msxml, и наоборот: одинесник, привыкнув к ней, уже не будет в ступоре при необходимости использования данной технологии в каком-нибудь скрипте на vbs
    3. возможность выбирать версию парсера (в примере ниже выбирается версия 6)

    Функция ВывестиЭлем(ТекЭлем,Знач Смещ);
        
        Рез=1;
        Попытка
            Если (ТекЭлем.nodeType=1) Тогда
                Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":","!");
            ИначеЕсли (ТекЭлем.nodeType=3) Тогда
                Сообщить(Смещ+"Текст элемента: "+ТекЭлем.nodeValue);
            ИначеЕсли (ТекЭлем.nodeType=4) Тогда
                Сообщить(Смещ+"CDATA: "+ТекЭлем.nodeValue);
            ИначеЕсли (ТекЭлем.nodeType=8) Тогда
                Сообщить(Смещ+"Комментарий: "+ТекЭлем.nodeValue,"I");
            Иначе
                Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":");
                Сообщить(Смещ+"Тип: "+ТекЭлем.nodeType);
            КонецЕсли;
            
            Для ном=0 По ТекЭлем.attributes.length-1 Цикл
                ТекАтр=ТекЭлем.attributes(ном);
                Сообщить(Смещ+"Атрибут: "+ТекАтр.nodeName+", значение: "+ТекАтр.nodeValue);
            КонецЦикла;
            
        Исключение
            Рез=0;
        КонецПопытки;
        
        
        Смещ=Смещ+"    ";
        
        Для ном=0 По ТекЭлем.childNodes.length-1 Цикл
            ДочЭлем=ТекЭлем.childNodes(ном);
            Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ);
        КонецЦикла;
        
        Возврат Рез;
    КонецФункции
    
    //*******************************************
    Функция Сформировать()
     
        ИмяФайла="D:\1.xml";
        
        Попытка
            ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
            Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251""");
        Исключение
            Сообщить("Не удалось создать объект DOMDocument","!");
            Возврат 0;
        КонецПопытки;
        ДОМ.insertBefore(Узел,);
        
        
        ТекЭлем=ДОМ.appendChild(ДОМ.createElement("Файл"));
        Текст=ДОМ.createTextNode("Здесь содержимое Файл");
        ТекЭлем.appendChild(Текст);
        ТекЭлем.setAttribute("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
        Комм=ДОМ.createComment("Далее следует содержимое файла");
        ТекЭлем.appendChild(Комм);
        
        ТекЭлем=ТекЭлем.appendChild(ДОМ.createElement("СодержимоеФайла"));
        Текст=ДОМ.createTextNode("Здесь содержимое СодержимоеФайла");
        ТекЭлем.appendChild(Текст);
        ТекЭлем.setAttribute("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
        Текст=ДОМ.createCDATASection("Это секция CDATA");
        ТекЭлем.appendChild(Текст);
        ДОМ.save(ИмяФайла);
        
        Попытка
            ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
        Исключение
            Сообщить("Не удалось создать объект DOMDocument","!");
            Возврат 0;
        КонецПопытки;
        
        ДОМ.async=0;
        ДОМ.validateOnParse=-1;
        ДОМ.resolveExternals=-1;
        ДОМ.load(ИмяФайла);
        
        Если (ДОМ.parseError.errorCode<>0) Тогда
            // ошибки при проверке валидности
     
            Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!");
            Возврат 0;
        КонецЕсли;
    
        Рут=ДОМ.documentElement();
        Смещ="";
        Рез=ВывестиЭлем(Рут,Смещ);
        
        Возврат Рез;
    КонецФункции
    
    
    Ответы: (1)
  2. (0) А зачем выбирать версию парсера? А вдруг ее нет в системе? :)

    Могу накидать в общих чертах принцип работы с msxml/1C.xml c примерами xpath, xsl, xslt.

  3. 18.12.2013 10:09:26 отредактировано andrewks

    sapphire А зачем выбирать версию парсера?

    практически все современные встречающиеся мне схемы корректно обрабатываются только 6-й версией парсера.
    даже с 4-й проблемы возникают, не говоря уже про 3-ю.

    sapphire Могу накидать в общих чертах принцип работы с msxml/1C.xml c примерами xpath, xsl, xslt.

    давай! лишним не будет

    и ещё бы примерчик по namespace до кучи

  4. Зато, 4-версия хорошо работает с большими объемами данных :)
    PS: namespace используется в основном в web-сервисах..

    ... и кстати, уродцы 1С!!! Почему глобальной Фабрике XDTO нельзя задать собственное пространство имен?!

    Ответы: (4)
  5. (3) да она вообще глючная! по крайней мере, заставить её нормально работать со схемами у меня так и не получилось (правда, не проверял в 8.3 - может, там и допилили)

    Ответы: (5)
  6. (4) Не, не допилили, те же яйца, только в профиль :)

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