КомментарийDOM.ЗаменитьДочерний

Методы · ReplaceChild

Заменяет дочерний узел, указанный параметром <СтарыйУзел>, на узел, указанный параметром <НовыйУзел>. Если новый узел - это ФрагментДокумента, то заменяемый узел будет заменен всеми дочерними узлами фрагмента документа. Если новый узел уже содержится в дереве документа, то он сначала удаляется из дочерних узлов старого родителя и вставляется в список дочерних узлов нового родителя.

Синтаксис

ЗаменитьДочерний(<НовыйУзел>, <СтарыйУзел>)
Полное описание, параметры и ограничения

КомментарийDOM.ЗаменитьДочерний (DOMComment.ReplaceChild)

КомментарийDOM (DOMComment)

ЗаменитьДочерний (ReplaceChild)

Доступен, начиная с версии 8.1.

Синтаксис:
ЗаменитьДочерний(<НовыйУзел>, <СтарыйУзел>)
Параметры:

<НовыйУзел> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Новый дочерний узел.

<СтарыйУзел> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Существующий дочерний узел.
Возвращаемое значение:
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Значение прежнего узла.
Описание:

Заменяет дочерний узел, указанный параметром <СтарыйУзел>, на узел, указанный параметром <НовыйУзел>.
Если новый узел - это ФрагментДокумента, то заменяемый узел будет заменен всеми дочерними узлами фрагмента документа.
Если новый узел уже содержится в дереве документа, то он сначала удаляется из дочерних узлов старого родителя и вставляется в список дочерних узлов нового родителя.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Примечание:
Исключение генерируется в случаях:
если данный узел не допускает в качестве дочерних добавляемый узел или добавляемый узел является одним из предков данного;

если узел добавляется сам в себя;

если данный узел - Документ и добавляется второй узел ОпределениеТипаДокумента или Элемент;

если добавляемый узел был создан документом отличным от создавшего данный узел;

если данный узел в режиме только для чтения или если предыдущий родитель добавляемого узла в режиме Только для чтения;

если заменяемый узел не найден;

если добавляемый узел является дочерним узлом узла Документ и реализация не поддерживает удаления узлов ОпределениеТипаДокумента и Элемент у узла Документ.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Понять, почему у текста, CDATA, комментария и инструкции нет дочерних элементов

Наличие общих методов DOM у листового узла не означает, что он может содержать element. Проверяем отказы и сохраняем значения четырёх реальных видов узлов.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.

  2. Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.

  3. Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.

  4. У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.

Документ = Новый ДокументDOM("", "product");
Листья = Новый Массив;
Листья.Добавить(Документ.СоздатьТекстовыйУзел("Книга"));
Листья.Добавить(Документ.СоздатьСекциюCDATA("<описание>"));
Листья.Добавить(Документ.СоздатьКомментарий("Учебный товар"));
Листья.Добавить(Документ.СоздатьИнструкциюОбработки("guide", "mode=test"));
Для Каждого Лист Из Листья Цикл
    ПрежнееЗначение = Лист.ЗначениеУзла;
    Кандидат = Документ.СоздатьЭлемент("note");
    Отказов = 0;
    Попытка
        Лист.ДобавитьДочерний(Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.ВставитьПеред(Кандидат, Неопределено);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.ЗаменитьДочерний(Кандидат, Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.УдалитьДочерний(Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Если Отказов <> 4 Тогда
        ВызватьИсключение "Неожиданно принята недопустимая операция над листовым узлом";
    КонецЕсли;
    Лист.Нормализовать();
    Сообщить(СтрШаблон("%1: ожидаемых отказов %2", ТипЗнч(Лист), Отказов));
    Сообщить(Лист.ДочерниеУзлы.Количество() = 0);
    Сообщить(Лист.ЗначениеУзла = ПрежнееЗначение);
    Сообщить(Кандидат.РодительскийУзел = Неопределено);
КонецЦикла;

Разбор по шагам

  1. Создаём четыре листовых узла. Ни один не содержит детей; candidate note тоже принадлежит тому же документу, чтобы не спутать ошибку иерархии с другим владельцем.

  2. Добавление и вставка элемента запрещены для этих видов узлов. Замена/удаление также не находят существующего ребёнка: candidate не находится у листа.

  3. Каждую ожидаемую ошибку считаем отдельно. Проверка общего количества выполняется вне этих блоков, иначе можно ошибочно засчитать собственное контрольное исключение.

  4. Нормализовать допустим как общий метод, но у листа нечего объединять. Значение и пустой список детей не меняются.

Как проверить результат

  1. Для каждого из четырёх видов выводится ожидаемых отказов 4.

  2. Для каждого вида три логические проверки дают Истина: нет детей, значение прежнее, candidate отсоединён.

  3. Всего 16 ожидаемых отказов. Ни один не подавляет неожиданное успешное изменение: оно вызовет контрольную ошибку.

Ожидаемый результат

Объяснено поведение общих методов на листовых узлах вместо фиктивного примера добавления невозможных детей.

На что обратить внимание

  1. Этот пример намеренно демонстрирует ошибки на собственных данных; в рабочем алгоритме проверяйте вид узла заранее.

  2. Для описания с вложенными тегами создавайте ЭлементDOM-контейнер и помещайте в него текст/элементы. ТекстDOM сам контейнером не является.

  3. Не переносите правило на АтрибутDOM: его представление значения может включать текстовые дочерние узлы, это другой вид DOM-узла.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.