ДокументDOM.КлонироватьУзел

Методы · CloneNode

Копирует (клонирует) данный узел. Для копии не определены родительский узел и пользовательские данные. Копирование узла Элемент копирует все атрибуты и их значения, включая сгенерированные XML процессором значения по умолчанию. Копирование дочерних узлов производится только в случае установленного признака "глубокого" копирования. "Глубокое" копирование включает текст, содержащийся в узле Элемент, если текст содержится как дочерний узел Текст. Копирование узлов Атрибут отличается от копирования их как части узла Элемент тем, что признак явного указания свойства Указан будет установлен в значение Истина. Копирование узлов Атрибут всегда выполняется с копированием дочерних узлов (представляющих значение атрибута), вне зависимости от режима копирования. Копирование узла СсылкаНаСущность автоматически конструирует поддерево, если соответствующий узел Сущность доступен, вне зависимости от режима копирования. Копирование других типов узлов просто возвращает копию данного узла. В случае копирования поддерева в режиме Только для чтения создает редактируемую копию, но дочерние узлы копии узла СсылкаНаСущность останутся в режиме Только для чтения.

Синтаксис

КлонироватьУзел(<ГлубокоеКопирование>)
Полное описание, параметры и ограничения

ДокументDOM.КлонироватьУзел (DOMDocument.CloneNode)

ДокументDOM (DOMDocument)

КлонироватьУзел (CloneNode)

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

Синтаксис:
КлонироватьУзел(<ГлубокоеКопирование>)
Параметры:

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

Копирует (клонирует) данный узел.
Для копии не определены родительский узел и пользовательские данные.
Копирование узла Элемент копирует все атрибуты и их значения, включая сгенерированные XML процессором значения по умолчанию.
Копирование дочерних узлов производится только в случае установленного признака "глубокого" копирования. "Глубокое" копирование включает текст, содержащийся в узле Элемент, если текст содержится как дочерний узел Текст.
Копирование узлов Атрибут отличается от копирования их как части узла Элемент тем, что признак явного указания свойства Указан будет установлен в значение Истина. Копирование узлов Атрибут всегда выполняется с копированием дочерних узлов (представляющих значение атрибута), вне зависимости от режима копирования.
Копирование узла СсылкаНаСущность автоматически конструирует поддерево, если соответствующий узел Сущность доступен, вне зависимости от режима копирования.
Копирование других типов узлов просто возвращает копию данного узла.
В случае копирования поддерева в режиме Только для чтения создает редактируемую копию, но дочерние узлы копии узла СсылкаНаСущность останутся в режиме Только для чтения.

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

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

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

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

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

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

Клонировать весь XML-документ и сравнить структуру, а не ссылки

Полная копия документа — отдельный документ-владелец. XML-структура равна исходной, но идентичность и локальные служебные метки различаются.

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

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

Подготовка

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

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

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

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

Документ = Новый ДокументDOM("", "products");
Товар = Документ.СоздатьЭлемент("product");
Товар.УстановитьАтрибут("code", "A-01");
Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Книга"));
Документ.ЭлементДокумента.ДобавитьДочерний(Товар);
Документ.УстановитьПользовательскиеДанные("training-tag", "original-document");
Сообщить(Документ.ПолучитьПользовательскиеДанные("training-tag") = "original-document");
Копия = Документ.КлонироватьУзел(Истина);
Сообщить(ТипЗнч(Копия) = Тип("ДокументDOM"));
Сообщить(Документ.УзелРавен(Копия));
Сообщить(Не Документ.УзелИдентичен(Копия));
Сообщить(Копия.ПолучитьПользовательскиеДанные("training-tag") = Неопределено);
КопияТовара = Копия.ЭлементДокумента.ПервыйДочерний;
Сообщить(КопияТовара.ДокументВладелец = Копия);
Сообщить(Товар.ДокументВладелец = Документ);
КопияТовара.УстановитьАтрибут("code", "COPY");
Сообщить(Товар.ПолучитьАтрибут("code") = "A-01");
Сообщить(Не Документ.УзелРавен(Копия));

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

  1. Строим исходный документ целиком: products/product с атрибутом и текстовым ребёнком.

  2. УстановитьПользовательскиеДанные записывает локальную метку документа, не XML-атрибут.

  3. КлонироватьУзел(Истина) копирует весь документ. УзелРавен сравнивает структуру и значения, УзелИдентичен — тот же ли это узел.

  4. У копии свои дети с владельцем Копия. Меняем code только там, после чего документы уже не равны; исходник сохраняет A-01.

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

  1. Девять логических проверок дают Истина.

  2. До изменения копии документы равны по структуре, но не идентичны. После изменения code копии они не равны.

  3. У копии нет training-tag; XML-данные исходника не изменены.

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

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

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

  1. КлонироватьУзел элемента и всего документа — разные операции: копия отдельного элемента первоначально сохраняет исходный документ-владелец.

  2. Не используйте УзелРавен как проверку подписи, бизнес-валидности или безопасности XML.

  3. Служебные данные не являются частью переносимого XML-контракта и не клонируются автоматически.

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

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

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

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

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