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

База знаний
  1. 11 г. назад
    &НаКлиенте
    Функция ВывестиЭлем_ДОМ(ДОМ,Знач Смещ);
        
        Рез=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-модель, конечно, идеальна

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