ЗаписьУзловDOM

Типы · DOMNodeWriter

Объект, осуществляющий запись данных XML в объектную модель DOM.

Полное описание, параметры и ограничения

ЗаписьУзловDOM (DOMNodeWriter)

ЗаписьУзловDOM (DOMNodeWriter)

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

Свойства:
КонтекстПространствИмен (NamespaceContext)
УзелDOM (DOMNode)

Методы:
ЗаписатьАтрибут (WriteAttribute)
ЗаписатьБезОбработки (WriteRaw)
ЗаписатьИнструкциюОбработки (WriteProcessingInstruction)
ЗаписатьКомментарий (WriteComment)
ЗаписатьКонецАтрибута (WriteEndAttribute)
ЗаписатьКонецЭлемента (WriteEndElement)
ЗаписатьНачалоАтрибута (WriteStartAttribute)
ЗаписатьНачалоЭлемента (WriteStartElement)
ЗаписатьОбъявлениеXML (WriteXMLDeclaration)
ЗаписатьСекциюCDATA (WriteCDATASection)
ЗаписатьСоответствиеПространстваИмен (WriteNamespaceMapping)
ЗаписатьСсылкуНаСущность (WriteEntityReference)
ЗаписатьТекст (WriteText)
ЗаписатьТекущий (WriteCurrent)
ЗаписатьТипДокумента (WriteDocumentType)
НайтиПрефикс (LookupPrefix)
Закрыть (Close)
Открыть (Open)

Конструкторы:
По умолчанию

Описание:

Объект, осуществляющий запись данных XML в объектную модель DOM.

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

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

См. также:
Глобальный контекст, метод ЗаписатьXML
ФабрикаXDTO, метод ЗаписатьXML
СериализаторXDTO, метод ЗаписатьXML
ЗаписьСообщенияОбмена, метод НачатьЗапись
ЗаписьDOM, метод Записать

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

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

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

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

Копировать XML из DOM в DOM по одному событию чтения

ЗаписатьТекущий не читает следующий узел. Чтение продвигаем ровно один раз в условии цикла и копируем каждое событие; исходное дерево остаётся неизменным.

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

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

Подготовка

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

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

  3. В этом блоке каждый пример создаёт собственное дерево DOM в памяти. Файлы, сеть, данные документов и справочников не используются.

  4. Открыть у ЧтениеУзловDOM принимает узел, а у ЗаписьУзловDOM — документ-владелец будущих узлов. Это не открытие файла.


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

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

  1. Открываем чтение на корневом элементе исходного документа, а запись — на другом документе-владельце.

  2. Прочитать в условии цикла выбирает событие, ЗаписатьТекущий переносит только текущее состояние. Начала, тексты и концы проходят в исходном порядке.

  3. После окончания получаем фрагмент и включаем его под container целевого документа. Здесь обёртка container намеренная, не копия исходного корня документа.

  4. Проверяем владельцев и меняем code только у копии. Исходный A-01 не меняется — узлы не перемещались между документами.

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

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

  2. Восемь событий: начало products, начало product, текст, конец product, начало product, текст, конец product, конец products.

  3. Копия имеет container/products с двумя товарами; у исходного первого товара после изменения копии остаётся A-01.

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

Продемонстрирован полный событийный перенос собственного XML с независимыми целевыми узлами.

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

  1. Не вызывайте Прочитать внутри тела дополнительно: тогда часть событий пропадёт. ЗаписатьТекущий сам чтение не продвигает.

  2. Атрибуты начала элемента переносятся вместе с его состоянием, поэтому здесь не нужно отдельно обходить атрибуты и дублировать их запись.

  3. Число восемь относится к этому дереву без форматирующих пробелов. Это не универсальное число событий двух товарных строк.

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

Записать элемент и атрибут с разными пространствами имён

Имя g:product и URI пространства — разные сведения. Атрибут без префикса не получает пространство элемента; m:unit имеет собственный URI.

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

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

Подготовка

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

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

  3. В этом блоке каждый пример создаёт собственное дерево DOM в памяти. Файлы, сеть, данные документов и справочников не используются.

  4. Открыть у ЧтениеУзловDOM принимает узел, а у ЗаписьУзловDOM — документ-владелец будущих узлов. Это не открытие файла.

URI = "urn:guide:products";
URIЕдиниц = "urn:guide:units";
Документ = Новый ДокументDOM("", "container");
Запись = Новый ЗаписьУзловDOM;
Запись.Открыть(Документ);
Попытка
    Запись.ЗаписатьНачалоЭлемента("g:product");
    Запись.ЗаписатьСоответствиеПространстваИмен("g", URI);
    Запись.ЗаписатьСоответствиеПространстваИмен("m", URIЕдиниц);
    Сообщить(Запись.НайтиПрефикс(URI) = "g");
    Контекст = Запись.КонтекстПространствИмен;
    Сообщить(Контекст.НайтиURIПространстваИмен("m") = URIЕдиниц);
    Запись.ЗаписатьАтрибут("code", "A-01");
    Запись.ЗаписатьАтрибут("unit", URIЕдиниц, "шт");
    Запись.ЗаписатьНачалоЭлемента("name", URI);
    Запись.ЗаписатьТекст("Книга");
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    Фрагмент = Запись.УзелDOM;
Исключение
    Запись.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Запись.Закрыть();
Документ.ЭлементДокумента.ДобавитьДочерний(Фрагмент);
Товар = Документ.ЭлементДокумента.ПервыйДочерний;
Сообщить(Товар.ЛокальноеИмя = "product");
Сообщить(Товар.URIПространстваИмен = URI);
Сообщить(Товар.ПолучитьУзелАтрибута("code").URIПространстваИмен = "");
Сообщить(Товар.ПолучитьАтрибут(URIЕдиниц, "unit") = "шт");
Сообщить(Товар.ПервыйДочерний.URIПространстваИмен = URI);
Сообщить(Товар.ПервыйДочерний.ТекстовоеСодержимое = "Книга");

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

  1. Начало g:product сопровождаем двумя объявлениями префиксов до записи атрибутов и содержимого.

  2. НайтиПрефикс выполняется в активном контексте записи. КонтекстПространствИмен показывает сопоставление m с URI единиц.

  3. code записан без URI, unit — с явным URI единиц. Вложенный name создаём вариантом метода с локальным именем и URI товара.

  4. После присоединения фрагмента проверяем имена по паре ЛокальноеИмя/URI, а не только по написанию префикса.

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

  1. Восемь логических сообщений дают Истина.

  2. У product и name URI urn:guide:products; у code URI пустой, у unit — urn:guide:units.

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

Подготовлен namespace-aware XML и показана разница между пространствами элемента и атрибутов.

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

  1. Соответствие нужно записать до текста и вложенных элементов. Одной строки g:product недостаточно для переносимого namespace-aware документа.

  2. URI пространства имён — идентификатор, а не адрес, по которому этот пример должен что-то скачивать.

  3. Выбранный сериализатором префикс может отличаться; сравнивайте URI и локальное имя.

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

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

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

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

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