ДокументDOM.СоздатьФрагментДокумента

Методы · CreateDocumentFragment

Создает узел DOM - фрагмент документа.

Синтаксис

СоздатьФрагментДокумента()
Полное описание, параметры и ограничения

ДокументDOM.СоздатьФрагментДокумента (DOMDocument.CreateDocumentFragment)

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

СоздатьФрагментДокумента (CreateDocumentFragment)

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

Синтаксис:
СоздатьФрагментДокумента()
Возвращаемое значение:
Тип: ФрагментДокументаDOM.

Описание:

Создает узел DOM - фрагмент документа.

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

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

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

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

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

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

Начать обход с атрибута или отдельного фрагмента

Отбор атрибутов не добавляет их к обходу дочерних тегов: для этого урок задаёт сам атрибут корнем отдельного итератора.

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

Полный серверный общий модуль собственной учебной базы; работа с собственными DOM в памяти.

Подготовка

  1. Собственная учебная база 8.5.1.1343. Создайте серверный общий модуль УчебныйОбходXML с флагом Сервер. Вставьте полный модуль одного урока и вызовите УчебныйОбходXML.ВыполнитьПример() из серверной команды собственной обработки.

  2. Деревья создаются из фиксированных учебных данных. Нет чтения файлов, запросов сети, записей базы или произвольного внешнего XML.

  3. Свойства ФильтрУзловDOM доступны только для чтения. Набор видов узлов задаётся параметрами конструктора, а не присваиванием ОтображатьЭлемент=Истина.

  4. Параметры конструктора — значения перечисления ПараметрыОтбораУзловDOM, не Булево. Пустые позиции в коде оставляют соответствующие виды не включёнными согласно справке.

  5. Подсчёт относится к дереву без форматирующих пробелов, построенному этим уроком. Запуск внутри 1С здесь ещё не подтверждён.

Процедура ВыполнитьПример() Экспорт
    Документ = Новый ДокументDOM("", "products");
    Корень = Документ.ЭлементДокумента;
    Корень.УстановитьАтрибут("code", "A-01");
    Атрибут = Корень.ПолучитьУзелАтрибута("code");
    ФильтрАтрибута = Новый ФильтрУзловDOM(, , ПараметрыОтбораУзловDOM.ОтображатьАтрибут);
    Сообщить(ФильтрАтрибута.ОтображатьАтрибут);
    Атрибуты = СобратьУчебныеУзлы(Документ, Атрибут, ФильтрАтрибута);
    Сообщить(Атрибуты.Количество() = 1);
    Сообщить(Атрибуты[0] = Атрибут);
    Сообщить(Атрибуты[0].Значение = "A-01");
    Фрагмент = Документ.СоздатьФрагментДокумента();
    Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("book"));
    Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("pen"));
    ФильтрФрагмента = Новый ФильтрУзловDOM(, ПараметрыОтбораУзловDOM.ОтображатьЭлемент, , , , , , , , , , ПараметрыОтбораУзловDOM.ОтображатьФрагментДокумента);
    Сообщить(ФильтрФрагмента.ОтображатьФрагментДокумента);
    Сообщить(ФильтрФрагмента.ОтображатьЭлемент);
    Узлы = СобратьУчебныеУзлы(Документ, Фрагмент, ФильтрФрагмента);
    Сообщить(Узлы.Количество() = 3);
    Сообщить(Узлы[0] = Фрагмент);
    Сообщить(Узлы[1].ИмяУзла = "book");
    Сообщить(Узлы[2].ИмяУзла = "pen");
    Сообщить(Корень.ДочерниеУзлы.Количество() = 0);
КонецПроцедуры

Функция СобратьУчебныеУзлы(Документ, Корень, Фильтр)
    Результат = Новый Массив;
    Итератор = Документ.СоздатьИтераторУзлов(Корень, Фильтр, Ложь);
    ОшибкаОбхода = "";
    Попытка
        Узел = Итератор.СледующийУзел();
        Пока Узел <> Неопределено Цикл
            Результат.Добавить(Узел);
            Узел = Итератор.СледующийУзел();
        КонецЦикла;
    Исключение
        ОшибкаОбхода = ОписаниеОшибки();
    КонецПопытки;
    ОшибкаЗавершения = "";
    Попытка
        Итератор.Отсоединить();
    Исключение
        ОшибкаЗавершения = ОписаниеОшибки();
    КонецПопытки;
    Если Не ПустаяСтрока(ОшибкаОбхода) Или Не ПустаяСтрока(ОшибкаЗавершения) Тогда
        ВызватьИсключение ОшибкаОбхода + " " + ОшибкаЗавершения;
    КонецЕсли;
    Возврат Результат;
КонецФункции

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

  1. Атрибут code принадлежит products, но не содержится в его ДочерниеУзлы. Передаём реальный АтрибутDOM как самостоятельный корень.

  2. Фильтр атрибута оставляет в результате один атрибут. Его значение A-01 читаем после проверки количества.

  3. Отдельный ФрагментДокументаDOM принадлежит тому же документу и содержит book/pen. Фрагмент ещё не вставлен в products.

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

  5. Последнее сравнение доказывает, что обход не переместил фрагмент в корень документа.

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

  1. Одиннадцать проверок ожидаются Истина: четыре для атрибута и семь для фрагмента/неизменности корня.

  2. Фрагмент остаётся отдельным контейнером; в products нет новых дочерних тегов.

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

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

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

  1. Добавление фрагмента в другой узел перемещает его детей, поэтому это другая операция и другой результат.

  2. Не путать значение АтрибутDOM со значением ФильтрУзловDOM: типы создаются разными API.

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

Собрать товары во фрагмент и перенести его детей в корень

ФрагментДокументаDOM позволяет подготовить группу узлов. При добавлении фрагмента в дерево перемещаются его дети, а сам фрагмент не становится XML-тегом.

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

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

Подготовка

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

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


Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Фрагмент = Документ.СоздатьФрагментДокумента();
Для Номер = 1 По 2 Цикл
    Товар = Документ.СоздатьЭлемент("product");
    Товар.УстановитьАтрибут("code", ?(Номер = 1, "A-01", "B-02"));
    Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(?(Номер = 1, "Книга", "Ручка")));
    Фрагмент.ДобавитьДочерний(Товар);
КонецЦикла;
Сообщить(Фрагмент.ДокументВладелец = Документ);
Сообщить(Фрагмент.РодительскийУзел = Неопределено);
Сообщить(Фрагмент.ЕстьДочерниеУзлы());
Сообщить(Фрагмент.ДочерниеУзлы.Количество() = 2);
ПервыйТовар = Фрагмент.ПервыйДочерний;
ПоследнийТовар = Фрагмент.ПоследнийДочерний;
Сообщить(ПервыйТовар <> ПоследнийТовар);
Корень.ДобавитьДочерний(Фрагмент);
Сообщить(Фрагмент.ДочерниеУзлы.Количество() = 0);
Сообщить(Не Фрагмент.ЕстьДочерниеУзлы());
Сообщить(Корень.ДочерниеУзлы.Количество() = 2);
Сообщить(ПервыйТовар.РодительскийУзел = Корень);
Сообщить(Корень.ПервыйДочерний = ПервыйТовар);

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

  1. Фабрика документа создаёт фрагмент того же документа; перенос между разными документами требует другого API.

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

  3. ДобавитьДочерний с фрагментом переносит его дочерние узлы в корень. После этого фрагмент пустой.

  4. Родитель первого товара теперь products; идентичность самого узла сохраняется.

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

  1. До переноса у фрагмента 2 ребёнка, после — 0; у корня после переноса 2 ребёнка.

  2. ПервыйТовар.РодительскийУзел равен Корень; последний контроль также Истина.

  3. Повторное добавление уже пустого фрагмента не создаёт ещё два товара.

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

Группа подготовленных узлов перемещена в документ без выдуманного тега fragment.

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

  1. Фрагмент не является независимым документом с собственным корневым тегом.

  2. Это перемещение, не копирование: исходный фрагмент лишается своих детей.

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

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

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

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

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