Работа с xml при помощи DOM в 1С 8

База знаний
  1. 10 г. назад
    &НаКлиенте
    Функция ВывестиЭлем_ДОМ(ДОМ,Знач Смещ);
        
        Рез=1;
        Попытка
    		ТипУзла=ДОМ.ТипУзла;
    		Если (ТипУзла=ТипУзлаDOM.Документ) Тогда
    			;
    		ИначеЕсли (ТипУзла=ТипУзлаDOM.Элемент) Тогда
    			Смещ=Смещ+"    ";
    			Сообщить(Смещ+"Элемент "+ДОМ.ИмяУзла+":",СтатусСообщения.Важное);
    			
    			Для каждого ТекАтр из ДОМ.Атрибуты Цикл
    				Сообщить(Смещ+"Атрибут: "+ТекАтр.ИмяУзла+", значение: <"+ТекАтр.ЗначениеУзла+">");
    			КонецЦикла;
    		ИначеЕсли (ТипУзла=ТипУзлаDOM.Текст) Тогда 
    			Сообщить(Смещ+"Текст элемента: <"+ДОМ.ЗначениеУзла+">");
    		ИначеЕсли (ТипУзла=ТипУзлаDOM.СекцияCDATA) Тогда 
    			Сообщить(Смещ+"CDATA: <"+ДОМ.ЗначениеУзла+">");
    		ИначеЕсли (ТипУзла=ТипУзлаDOM.Комментарий) Тогда 
    			Сообщить(Смещ+"Комментарий: <"+ДОМ.ЗначениеУзла+">",СтатусСообщения.Информация);
    		Иначе
    			Сообщить(Смещ+"Элемент "+ДОМ.ИмяУзла+":");
            	Сообщить(Смещ+"Тип: "+ДОМ.ЗначениеУзла);
    		КонецЕсли; 
    		
    		Для каждого ТекУзел из ДОМ.ДочерниеУзлы Цикл
    			ВывестиЭлем_ДОМ(ТекУзел,Смещ);
    		КонецЦикла;
    	Исключение
    	    Сообщить(ОписаниеОшибки());
    		Рез=0;
    	КонецПопытки;
    	
    	Возврат Рез;
    КонецФункции
    
    &НаКлиенте
    Процедура ВыгрузитьХМЛ(ИмяФайла) Экспорт
    	ДОМ=Новый ДокументDOM;
    	ТекЭлем=ДОМ.СоздатьЭлемент("Файл");
    	ТекЭлем.УстановитьАтрибут("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
    	ТекТекст=ДОМ.СоздатьТекстовыйУзел("Здесь содержимое Файл");
    	ТекКомм=ДОМ.СоздатьКомментарий("Далее следует содержимое файла");
    	ТекЭлем.ДобавитьДочерний(ТекТекст);
    	ТекЭлем.ДобавитьДочерний(ТекКомм);
    	ДОМ.ДобавитьДочерний(ТекЭлем);
    	ТекЭлем=ТекЭлем.ДобавитьДочерний(ДОМ.СоздатьЭлемент("СодержимоеФайла"));
    	ТекЭлем.УстановитьАтрибут("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
    	ТекТекст=ДОМ.СоздатьТекстовыйУзел("Здесь содержимое СодержимоеФайла");
    	ТекCDATA=ДОМ.СоздатьСекциюCDATA("Это секция CDATA");
    	ТекЭлем.ДобавитьДочерний(ТекТекст);
    	ТекЭлем.ДобавитьДочерний(ТекCDATA);
    	
    	ХМЛ=Новый ЗаписьXML;
    	ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЗаписиXML("windows-1251",,Ложь,Ложь));
    	ЗаписьДОМ=Новый ЗаписьDOM;
    	ЗаписьДОМ.Записать(ДОМ,ХМЛ);
    	ХМЛ.Закрыть();
    	
    	ПострДОМ=Новый ПостроительDOM;
    	ХМЛ=Новый ЧтениеXML;
    	ХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,ТипПроверкиXML.НетПроверки));
    	ДОМ=ПострДОМ.Прочитать(ХМЛ);
    	
    	ВывестиЭлем_ДОМ(ДОМ,"");
    	ХМЛ.Закрыть();
    КонецПроцедуры
    
    
  2. Для таких задач - и SAX сгодится. Если же DOM - то тут нужны несколько более весомые аргументы :-)

  3. К слову. Для таких тем нужен раздел типа "Книга знаний" или "Кулинарные рецепты". Ветки ведь (когда форум станет популярным) быстро утонут.

    Ответы: (3)
  4. (2) когда начнут тонуть - сделаю :) делов на пять минут, движок позволяет манипулировать с разделами

    Ответы: (4)
  5. (3) "Когда начнут тонуть..." - у тебя то корова телиться начнёт, то машина заводиться перестанет, то конь в курятнике насерит... :-)

    Ответы: (5)
  6. (4) а чтобы не выглядело голословным - уже сделано. за 3 минуты

  7. 15.12.2013 22:51:50 отредактировано andrewks

  8. 1. При работе с xml лучше использовать кодировку UNICODE
    2. Вообще непонятно к чему этот код.

    ИМХО, DOM нужен для парсинга xml т.е. выборки по узлам, например разбор ответа web-сервиса или формирование запроса к оным.
    Или же для xsl/xslt.

  9. sapphire Вообще непонятно к чему этот код.

    это просто пример, показывающий, как работать с узлами различных типов.
    для новичков, так сказать

    Ответы: (10) (29)
  10. sapphire При работе с xml лучше использовать кодировку UNICODE

    я за utf-8, он самый распространённый

  11. (8) если для 8 выше 0, то, ИМХО,
    "Это неправильные пчёлы! И они, наверное, делают неправильный мёд!" (с)

    Для восьмерок вообще низкоуровневые методы лучше не использовать, ИМХО.

    Для записи данных из 1С в другую нотацию xml надо использовать xslt.
    Для чтения - DOM & xpath

    Ответы: (11)
  12. (10) если уж на то пошло, для чтения проще использовать фабрику XDTO. по крайней мере, новичкам

    Ответы: (13)
  13. + в книжках непонятно с какой целью постоянно для ЧтениеXML примеры в основном с файлами, и крайне редко используется УстановитьСтроку()

  14. (11) Не, не совсем так, это нужно понимать идею схем и построение типов на основании схем. Сложновато для начала :)

    Ответы: (14)
  15. (13) не согласен. имхо, XDTO очень просто для новичка. проще, чем поэлементный обход по примеру как в сабже.
    прочитал файл - и шпарь по нисходящей, просто указывая имена элементов

  16. ещё бы пример с SAX-парсером, а то у меня никак времени на это не хватает

    Ответы: (16)
  17. (15) Это как?
    SAX в 1С= ЧтениеXML/ЗаписьXML вроде как :)

    Ответы: (17)
  18. (16) имел в виду wiki:Xerces

    Ответы: (18)
  19. (17) ну так это вообще не из той оперы. xerces используется в java и прочем.
    Кстати сказать, oracle-овая библиотечка шустрее намного

  20. sapphire ну так это вообще не из той оперы.

    там есть COM-серверы, которые тоже можно использовать в Выне

    Ответы: (20)
  21. (19) ну и зачем такой изврат?

    Ответы: (21)
  22. (20) а почему бы и нет? чтоб было, до кучи.

    Ответы: (22)
  23. (21) Я не люблю сферических коней в вакууме :)
    Обычно привожу рабочие примеры. С чем сталкивался и как решал.

    Ответы: (23)
  24. 18.12.2013 10:38:08 отредактировано andrewks

    (22) если честно, я вообще не вижу для Sleep практического применения, особенно в рабочих примерах :)

    но на форумах регулярно всплывают вопросы - как это сделать. зачем - дело десятое. пусть будет, раз кому-то надо

    Ответы: (24)
  25. (23) редко, но нужен, например для тягомотных транзакционных операций sleep используется для возможности записи пользователями между транзакциями. Ясно, что пока идет транзакция, пользователи в тот диапазон писать не могут.

    Ответы: (25)
  26. (24) не, можно, конечно, придумать. но можно и по-другому реализовать. например, в 7.7 - через обработку ожидания и порционную отработку

    Ответы: (26)
  27. (25) в 77 - sleep = Вопрос/Предупреждение

    Ответы: (27)
  28. (26) да полно вариантов. вопрос, вызов пинга, и т.д. Абрахамс, помнится, даже с вызовом своего любимого IE пример приводил

    Ответы: (28)
  29. (27) Зачем что-то вызывать на стороне, если есть встроенное и работает?

    Ответы: (30)
  30. (8) Если человек знает об "узлах разных типов" (то есть, хотя бы минимально вкурил, что есть XML) - тот не нужен ему такой пример. А sapphire прав - DOM нужна для "высокоуровневой" работы. Но тогда уж сразу и XSLT или что-то близкое.

  31. (28)это, конечно, аргумент

  32. DOM к сожаленью не умеет работать с большими объемами данных, поэтому в большистве случаев не применим.... Но выглядит красиво

    Ответы: (32)
  33. (31) большие - это сколько? если больше гига, тогда, конечно, тяжеловато будет крутится

    Ответы: (33)
  34. (32) У меня уже на пару сот мб уже ложился. Естественно зависит от машинки, но не приятно.

    А DOM приятна тем что работаешь не с текстом, а с коллекцией, которую удобно обходить.

    Ответы: (34)
  35. (33) всё так, всё так...
    для работы с небольшими xml-файлами DOM-модель, конечно, идеальна

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