Объект записи узлов DOM.
Полное описание, параметры и ограничения
ЗаписьDOM (DOMWriter)
ЗаписьDOM (DOMWriter)
Доступен, начиная с версии 8.1.
Свойства:
КонфигурацияDOM (DOMConfig)
Методы:
Записать (Write)
Конструкторы:
По умолчанию
Описание:
Объект записи узлов DOM.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 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.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Получить XML-строку с объявлением и без него
Управляем параметром xml-declaration объекта ЗаписьDOM. Обе строки передаются в память; наличие encoding в заголовке не доказывает кодировку ещё не существующего файла.
Где и как запускать
Полный текст собственного серверного общего модуля УчебныеЗадачи. Замените его учебное содержимое всем кодом ниже: процедура ВыполнитьПример уже включена, вспомогательная функция размещается после неё, не внутри процедуры.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.
У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.
Процедура ВыполнитьПример() Экспорт
Документ = Новый ДокументDOM("", "product");
Документ.ЭлементДокумента.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Книга"));
Сериализатор = Новый ЗаписьDOM;
Настройки = Сериализатор.КонфигурацияDOM;
Имена = Настройки.ИменаПараметров;
Сообщить(Имена.Содержит("xml-declaration"));
Если Не Настройки.ВозможноУстановитьПараметр("xml-declaration", Ложь)
Или Не Настройки.ВозможноУстановитьПараметр("xml-declaration", Истина) Тогда
ВызватьИсключение "Оба режима объявления XML должны поддерживаться";
КонецЕсли;
Прежнее = Настройки.ПолучитьПараметр("xml-declaration");
Попытка
Настройки.УстановитьПараметр("xml-declaration", Ложь);
БезОбъявления = ЗаписатьУчебнуюСтроку(Сериализатор, Документ);
Настройки.УстановитьПараметр("xml-declaration", Истина);
СОбъявлением = ЗаписатьУчебнуюСтроку(Сериализатор, Документ);
Исключение
Настройки.УстановитьПараметр("xml-declaration", Прежнее);
ВызватьИсключение;
КонецПопытки;
Настройки.УстановитьПараметр("xml-declaration", Прежнее);
Сообщить(СтрНайти(БезОбъявления, "<?xml") = 0);
Сообщить(СтрНайти(СОбъявлением, "<?xml") > 0);
Сообщить(СтрНайти(БезОбъявления, "Книга") > 0);
Сообщить(СтрНайти(СОбъявлением, "Книга") > 0);
Сообщить(Настройки.ПолучитьПараметр("xml-declaration") = Прежнее);
Сообщить(БезОбъявления);
Сообщить(СОбъявлением);
КонецПроцедуры
Функция ЗаписатьУчебнуюСтроку(Сериализатор, Документ)
Вывод = Новый ЗаписьXML;
Вывод.УстановитьСтроку();
Попытка
Сериализатор.Записать(Документ, Вывод);
Исключение
Вывод.Закрыть();
ВызватьИсключение;
КонецПопытки;
Возврат Вывод.Закрыть();
КонецФункции
Разбор по шагам
Один документ с текстом Книга сериализуем одним объектом ЗаписьDOM, меняя только xml-declaration.
Перед изменением проверяем имя параметра и возможность обоих значений. Каждая сериализация использует новое собственное ЗаписьXML для записи в строку.
Первый результат не содержит объявления <?xml, второй содержит. Текст товара сохраняется в обоих результатах.
Прежнюю настройку восстанавливаем в обеих ветках завершения. Выводим строки, чтобы заголовок был виден без отладчика.
Как проверить результат
Наличие параметра и пять последующих логических сравнений дают Истина.
Одна строка начинается содержимым product, вторая имеет объявление XML перед ним; обе содержат Книга.
Ожидаемый результат
Получены два варианта сериализации одного XML для разных контрактов обмена.
На что обратить внимание
Не добавляйте объявление вручную поверх результата, если сериализатор уже его записал: два объявления дадут некорректный XML.
Пример создаёт строки, не байты. Кодировка файла или HTTP-тела выбирается на следующем этапе записи/передачи.
Для XML-фрагмента внутри другого документа отдельное объявление обычно не требуется; согласуйте формат с получателем.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.