Склеить соседний XML-текст и отдельно управлять комментариями

Учебные задачи

Нормализация объединяет соседние текстовые узлы. Дополнительное удаление комментариев зависит от поддержки параметра comments; обе ветки результата объяснены.

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

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

Подготовка

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

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

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

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

Документ = Новый ДокументDOM("", "product");
Корень = Документ.ЭлементДокумента;
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Кни"));
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(""));
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("га"));
Корень.ДобавитьДочерний(Документ.СоздатьКомментарий("Учебная заметка"));
Сообщить(Корень.ДочерниеУзлы.Количество() = 4);
Настройки = Документ.КонфигурацияDOM;
Имена = Настройки.ИменаПараметров;
Для Индекс = 0 По Имена.Количество() - 1 Цикл
    Сообщить("Параметр документа: " + Имена.Элемент(Индекс));
КонецЦикла;
УдалятьКомментарии = Имена.Содержит("comments") И Настройки.ВозможноУстановитьПараметр("comments", Ложь);
Если УдалятьКомментарии Тогда
    Прежнее = Настройки.ПолучитьПараметр("comments");
    Настройки.УстановитьПараметр("comments", Ложь);
    Попытка
        Документ.НормализоватьДокумент();
    Исключение
        Настройки.УстановитьПараметр("comments", Прежнее);
        ВызватьИсключение;
    КонецПопытки;
    Настройки.УстановитьПараметр("comments", Прежнее);
    Сообщить(Настройки.ПолучитьПараметр("comments") = Прежнее);
Иначе
    Сообщить("Удаление комментариев настройкой не поддерживается; нормализуем только текст обычным методом");
    Документ.Нормализовать();
КонецЕсли;
Сообщить(Корень.ПервыйДочерний.ТекстовоеСодержимое = "Книга");
Сообщить(Корень.ТекстовоеСодержимое = "Книга");
Если УдалятьКомментарии Тогда
    Сообщить(Корень.ДочерниеУзлы.Количество() = 1);
Иначе
    Сообщить(Корень.ДочерниеУзлы.Количество() = 2);
КонецЕсли;

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

  1. Вручную создаём три соседних текста, включая пустой, и комментарий. До нормализации это четыре ребёнка, хотя текстовое содержимое уже равно Книга.

  2. Запрашиваем ИменаПараметров у документа. Значение comments из стандарта DOM проверяем на поддержку в этой платформе перед чтением и присваиванием.

  3. Если поддерживается comments=Ложь, НормализоватьДокумент объединяет текст и удаляет комментарий. Иначе обычный Нормализовать объединяет текст, сохраняя комментарий.

  4. Настройку восстанавливаем, но восстановление параметра не возвращает удалённый комментарий. Сам документ был изменён.

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

  1. Начальная проверка четырёх детей и обе проверки текста дают Истина.

  2. При поддержке comments после нормализации один текстовый ребёнок. Без поддержки — текст и комментарий, всего два; соответствующая проверка Истина.

  3. В ветке comments также проверяется восстановление прежнего значения настройки.

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

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

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

  1. Смысл comments=Ложь определён DOM Level 3 Core, а поддержку и допустимость значения проверяет текущая платформа: https://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMConfiguration .

  2. НормализоватьДокумент не является проверкой бизнес-схемы товара и не делает недоверенный текст безопасным HTML.

  3. Если нужно сохранить исходное дерево, нормализуйте его полную копию, а не рабочий оригинал.

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

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

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

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

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