ЗаписьDOM

Типы · DOMWriter

Объект записи узлов DOM.

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

ЗаписьDOM (DOMWriter)

ЗаписьDOM (DOMWriter)

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

Свойства:
КонфигурацияDOM (DOMConfig)

Методы:
Записать (Write)

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

Описание:

Объект записи узлов DOM.

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

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

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

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

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

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

Создать DOM-документ с товарами и выгрузить его в XML

DOM хранит всё дерево документа. Создаём узлы фабрикой документа, связываем их с корнем и затем сериализуем.

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

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

Подготовка

  1. Выполняйте на сервере. Конструктор ДокументDOM требует URI и имя корня: пустой URI означает отсутствие пространства имён.

  2. Все создаваемые узлы принадлежат одному документу; пример не использует файловую систему.

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

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

  1. Конструктор создаёт корень products; его получаем через ЭлементДокумента.

  2. СоздатьЭлемент и СоздатьТекстовыйУзел создают отдельные узлы; ДобавитьДочерний присоединяет их к дереву.

  3. ЗаписьDOM передаёт дерево в ЗаписьXML, а Закрыть возвращает готовый текст.

  4. ПостроительDOM читает полученную строку обратно и позволяет проверить число товаров.

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

  1. Корень называется products, ЕстьДочерниеУзлы возвращает Истина.

  2. До и после сериализации найдено по 2 элемента product с названиями Книга и Ручка.

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

Корректный XML-документ создан из дерева и прочитан обратно без изменения числа товаров.

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

  1. СоздатьЭлемент сам не вставляет узел в документ: без ДобавитьДочерний товар не попадёт в XML.

  2. DOM занимает память под весь документ. Для больших выгрузок часто подходит потоковая ЗаписьXML.

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

Получить XML-строку с объявлением и без него

Управляем параметром xml-declaration объекта ЗаписьDOM. Обе строки передаются в память; наличие encoding в заголовке не доказывает кодировку ещё не существующего файла.

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

Полный текст собственного серверного общего модуля УчебныеЗадачи. Замените его учебное содержимое всем кодом ниже: процедура ВыполнитьПример уже включена, вспомогательная функция размещается после неё, не внутри процедуры.

Подготовка

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

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

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

  4. У методов 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;
    Вывод.УстановитьСтроку();
    Попытка
        Сериализатор.Записать(Документ, Вывод);
    Исключение
        Вывод.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Возврат Вывод.Закрыть();
КонецФункции

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

  1. Один документ с текстом Книга сериализуем одним объектом ЗаписьDOM, меняя только xml-declaration.

  2. Перед изменением проверяем имя параметра и возможность обоих значений. Каждая сериализация использует новое собственное ЗаписьXML для записи в строку.

  3. Первый результат не содержит объявления <?xml, второй содержит. Текст товара сохраняется в обоих результатах.

  4. Прежнюю настройку восстанавливаем в обеих ветках завершения. Выводим строки, чтобы заголовок был виден без отладчика.

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

  1. Наличие параметра и пять последующих логических сравнений дают Истина.

  2. Одна строка начинается содержимым product, вторая имеет объявление XML перед ним; обе содержат Книга.

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

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

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

  1. Не добавляйте объявление вручную поверх результата, если сериализатор уже его записал: два объявления дадут некорректный XML.

  2. Пример создаёт строки, не байты. Кодировка файла или HTTP-тела выбирается на следующем этапе записи/передачи.

  3. Для XML-фрагмента внутри другого документа отдельное объявление обычно не требуется; согласуйте формат с получателем.

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

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

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

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

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