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

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

    прямая работа с 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) Не, не допилили, те же яйца, только в профиль :)

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