Добавляет узел в список дочерних. Если узел с уже присутствует в дереве документа, то он сначала удаляется из прежнего места. Если узлом является ФрагментДокумента, то все содержимое фрагмента будет добавлено в список дочерних.
Синтаксис
ДобавитьДочерний(<НовыйУзел>)Полное описание, параметры и ограничения
ЭлементDOM.ДобавитьДочерний (DOMElement.AppendChild)
ЭлементDOM (DOMElement)
ДобавитьДочерний (AppendChild)
Доступен, начиная с версии 8.1.
Синтаксис:
ДобавитьДочерний(<НовыйУзел>)
Параметры:
<НовыйУзел> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Новый дочерний узел DOM.
Возвращаемое значение:
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Описание:
Добавляет узел в список дочерних. Если узел с уже присутствует в дереве документа, то он сначала удаляется из прежнего места.
Если узлом является ФрагментДокумента, то все содержимое фрагмента будет добавлено в список дочерних.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Исключение вызывается в случаях:
если данный узел не допускает в качестве дочерних добавляемый узел или добавляемый узел является одним из предков данного узел добавляется сам в себя или данный узел - Документ и второй узел ОпределениеТипаДокумента или Элемент;
если добавляемый узел был создан документом, отличным от создавшего данный узел;
если данный узел в режиме Только для чтения или если предыдущий родитель добавляемого узла в режиме Только для чтения;
если добавляемый узел является дочерним узлом узла Документ и реализация не поддерживает удаления узлов ОпределениеТипаДокумента и Элемент у узла Документ.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Создать DOM-документ с товарами и выгрузить его в XML
DOM хранит всё дерево документа. Создаём узлы фабрикой документа, связываем их с корнем и затем сериализуем.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Выполняйте на сервере. Конструктор ДокументDOM требует URI и имя корня: пустой URI означает отсутствие пространства имён.
Все создаваемые узлы принадлежат одному документу; пример не использует файловую систему.
Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Для Номер = 1 По 2 Цикл
Товар = Документ.СоздатьЭлемент("product");
Товар.УстановитьАтрибут("code", ?(Номер = 1, "A-01", "B-02"));
Название = Документ.СоздатьЭлемент("name");
ТекстНазвания = Документ.СоздатьТекстовыйУзел(?(Номер = 1, "Книга", "Ручка"));
Название.ДобавитьДочерний(ТекстНазвания);
Товар.ДобавитьДочерний(Название);
Корень.ДобавитьДочерний(Товар);
КонецЦикла;
Сообщить(Корень.ИмяЭлемента);
Сообщить(Корень.ЕстьДочерниеУзлы());
Сообщить(Документ.ПолучитьЭлементыПоИмени("product").Количество());
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Сериализатор = Новый ЗаписьDOM;
Попытка
Сериализатор.Записать(Документ, Запись);
ТекстXML = Запись.Закрыть();
Исключение
Запись.Закрыть();
ВызватьИсключение;
КонецПопытки;
Сообщить(ТекстXML);
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
Попытка
Построитель = Новый ПостроительDOM;
Прочитанный = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Сообщить(Прочитанный.ЭлементДокумента.ПолучитьЭлементыПоИмени("product").Количество());Разбор по шагам
Конструктор создаёт корень products; его получаем через ЭлементДокумента.
СоздатьЭлемент и СоздатьТекстовыйУзел создают отдельные узлы; ДобавитьДочерний присоединяет их к дереву.
ЗаписьDOM передаёт дерево в ЗаписьXML, а Закрыть возвращает готовый текст.
ПостроительDOM читает полученную строку обратно и позволяет проверить число товаров.
Как проверить результат
Корень называется products, ЕстьДочерниеУзлы возвращает Истина.
До и после сериализации найдено по 2 элемента product с названиями Книга и Ручка.
Ожидаемый результат
Корректный XML-документ создан из дерева и прочитан обратно без изменения числа товаров.
На что обратить внимание
СоздатьЭлемент сам не вставляет узел в документ: без ДобавитьДочерний товар не попадёт в XML.
DOM занимает память под весь документ. Для больших выгрузок часто подходит потоковая ЗаписьXML.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Получить текст, CDATA, комментарий и инструкцию без тегов
Четыре разных вида детей одного товара включаются в фильтр явно; комментарий не смешивается с данными товара.
Где и как запускать
Полный серверный общий модуль собственной учебной базы; работа с собственными DOM в памяти.
Подготовка
Собственная учебная база 8.5.1.1343. Создайте серверный общий модуль УчебныйОбходXML с флагом Сервер. Вставьте полный модуль одного урока и вызовите УчебныйОбходXML.ВыполнитьПример() из серверной команды собственной обработки.
Деревья создаются из фиксированных учебных данных. Нет чтения файлов, запросов сети, записей базы или произвольного внешнего XML.
Свойства ФильтрУзловDOM доступны только для чтения. Набор видов узлов задаётся параметрами конструктора, а не присваиванием ОтображатьЭлемент=Истина.
Параметры конструктора — значения перечисления ПараметрыОтбораУзловDOM, не Булево. Пустые позиции в коде оставляют соответствующие виды не включёнными согласно справке.
Подсчёт относится к дереву без форматирующих пробелов, построенному этим уроком. Запуск внутри 1С здесь ещё не подтверждён.
Процедура ВыполнитьПример() Экспорт
Документ = Новый ДокументDOM("", "product");
Корень = Документ.ЭлементДокумента;
Текст = Документ.СоздатьТекстовыйУзел("Книга");
CDATA = Документ.СоздатьСекциюCDATA("<price>250</price>");
Комментарий = Документ.СоздатьКомментарий("Собственный учебный товар");
Инструкция = Документ.СоздатьИнструкциюОбработки("guide", "mode=test");
Корень.ДобавитьДочерний(Текст);
Корень.ДобавитьДочерний(CDATA);
Корень.ДобавитьДочерний(Комментарий);
Корень.ДобавитьДочерний(Инструкция);
Фильтр = Новый ФильтрУзловDOM(, , , ПараметрыОтбораУзловDOM.ОтображатьТекст, ПараметрыОтбораУзловDOM.ОтображатьСекцииCDATA, , , ПараметрыОтбораУзловDOM.ОтображатьИнструкциюОбработки, ПараметрыОтбораУзловDOM.ОтображатьКомментарий);
Сообщить(Фильтр.ОтображатьТекст);
Сообщить(Фильтр.ОтображатьСекцииCDATA);
Сообщить(Фильтр.ОтображатьКомментарий);
Сообщить(Фильтр.ОтображатьИнструкциюОбработки);
Сообщить(НЕ Фильтр.ОтображатьЭлемент);
Узлы = СобратьУчебныеУзлы(Документ, Корень, Фильтр);
Сообщить(Узлы.Количество() = 4);
Сообщить(Узлы[0] = Текст);
Сообщить(Узлы[1] = CDATA);
Сообщить(Узлы[2] = Комментарий);
Сообщить(Узлы[3] = Инструкция);
Сообщить(Корень.ПолучитьЭлементыПоИмени("price").Количество() = 0);
КонецПроцедуры
Функция СобратьУчебныеУзлы(Документ, Корень, Фильтр)
Результат = Новый Массив;
Итератор = Документ.СоздатьИтераторУзлов(Корень, Фильтр, Ложь);
ОшибкаОбхода = "";
Попытка
Узел = Итератор.СледующийУзел();
Пока Узел <> Неопределено Цикл
Результат.Добавить(Узел);
Узел = Итератор.СледующийУзел();
КонецЦикла;
Исключение
ОшибкаОбхода = ОписаниеОшибки();
КонецПопытки;
ОшибкаЗавершения = "";
Попытка
Итератор.Отсоединить();
Исключение
ОшибкаЗавершения = ОписаниеОшибки();
КонецПопытки;
Если Не ПустаяСтрока(ОшибкаОбхода) Или Не ПустаяСтрока(ОшибкаЗавершения) Тогда
ВызватьИсключение ОшибкаОбхода + " " + ОшибкаЗавершения;
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
Создаём каждый узел через ДокументDOM, поэтому у них один документ-владелец. Добавляем четыре узла в заранее известном порядке.
Текст в CDATA содержит угловые скобки, но не создаёт дочерний элемент price. Поиск по имени price должен дать ноль.
Конструктору передаём четыре значения перечисления на соответствующих позициях. Свойства фильтра затем только читаются.
Корневой product не входит в выбранные виды, однако его дети обходятся. Пропуск отображения родителя не означает запрет посещения всех потомков.
Проверяем идентичность возвращённых узлов, не только похожие текстовые значения.
Как проверить результат
Одиннадцать сравнений ожидаются Истина, порядок: Текст, CDATA, Комментарий, Инструкция.
Уголки в CDATA не являются XML-разметкой дерева. Комментарий и инструкция не считаются обычным текстом товара.
Ожидаемый результат
На собственных узлах показаны четыре независимых вида отбора и отсутствие ложного XML-тега из CDATA.
На что обратить внимание
Пробельные текстовые узлы внешнего XML могут добавить элементы результата: обещанные четыре относятся к этому построенному дереву.
Инструкция обработки DOM не является автоматически исполняемой командой 1С.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.