Приводит все узлы Текст на полной глубине поддерева данного узла, включая узлы Атрибут, в "нормальную" форму, где только структуры (например, элементы, комментарии, инструкции обработки, секции CDATA и ссылки на сущности) разделяются текстовыми узлами, т.е. смежные текстовые узлы отсутствуют.
Синтаксис
Нормализовать()Полное описание, параметры и ограничения
СекцияCDATADOM.Нормализовать (DOMCDATASection.Normalize)
СекцияCDATADOM (DOMCDATASection)
Нормализовать (Normalize)
Доступен, начиная с версии 8.1.
Синтаксис:
Нормализовать()
Описание:
Приводит все узлы Текст на полной глубине поддерева данного узла, включая узлы Атрибут, в "нормальную" форму, где только структуры (например, элементы, комментарии, инструкции обработки, секции CDATA и ссылки на сущности) разделяются текстовыми узлами, т.е. смежные текстовые узлы отсутствуют.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Понять, почему у текста, CDATA, комментария и инструкции нет дочерних элементов
Наличие общих методов DOM у листового узла не означает, что он может содержать element. Проверяем отказы и сохраняем значения четырёх реальных видов узлов.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.
У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.
Документ = Новый ДокументDOM("", "product");
Листья = Новый Массив;
Листья.Добавить(Документ.СоздатьТекстовыйУзел("Книга"));
Листья.Добавить(Документ.СоздатьСекциюCDATA("<описание>"));
Листья.Добавить(Документ.СоздатьКомментарий("Учебный товар"));
Листья.Добавить(Документ.СоздатьИнструкциюОбработки("guide", "mode=test"));
Для Каждого Лист Из Листья Цикл
ПрежнееЗначение = Лист.ЗначениеУзла;
Кандидат = Документ.СоздатьЭлемент("note");
Отказов = 0;
Попытка
Лист.ДобавитьДочерний(Кандидат);
Исключение
Отказов = Отказов + 1;
КонецПопытки;
Попытка
Лист.ВставитьПеред(Кандидат, Неопределено);
Исключение
Отказов = Отказов + 1;
КонецПопытки;
Попытка
Лист.ЗаменитьДочерний(Кандидат, Кандидат);
Исключение
Отказов = Отказов + 1;
КонецПопытки;
Попытка
Лист.УдалитьДочерний(Кандидат);
Исключение
Отказов = Отказов + 1;
КонецПопытки;
Если Отказов <> 4 Тогда
ВызватьИсключение "Неожиданно принята недопустимая операция над листовым узлом";
КонецЕсли;
Лист.Нормализовать();
Сообщить(СтрШаблон("%1: ожидаемых отказов %2", ТипЗнч(Лист), Отказов));
Сообщить(Лист.ДочерниеУзлы.Количество() = 0);
Сообщить(Лист.ЗначениеУзла = ПрежнееЗначение);
Сообщить(Кандидат.РодительскийУзел = Неопределено);
КонецЦикла;Разбор по шагам
Создаём четыре листовых узла. Ни один не содержит детей; candidate note тоже принадлежит тому же документу, чтобы не спутать ошибку иерархии с другим владельцем.
Добавление и вставка элемента запрещены для этих видов узлов. Замена/удаление также не находят существующего ребёнка: candidate не находится у листа.
Каждую ожидаемую ошибку считаем отдельно. Проверка общего количества выполняется вне этих блоков, иначе можно ошибочно засчитать собственное контрольное исключение.
Нормализовать допустим как общий метод, но у листа нечего объединять. Значение и пустой список детей не меняются.
Как проверить результат
Для каждого из четырёх видов выводится ожидаемых отказов 4.
Для каждого вида три логические проверки дают Истина: нет детей, значение прежнее, candidate отсоединён.
Всего 16 ожидаемых отказов. Ни один не подавляет неожиданное успешное изменение: оно вызовет контрольную ошибку.
Ожидаемый результат
Объяснено поведение общих методов на листовых узлах вместо фиктивного примера добавления невозможных детей.
На что обратить внимание
Этот пример намеренно демонстрирует ошибки на собственных данных; в рабочем алгоритме проверяйте вид узла заранее.
Для описания с вложенными тегами создавайте ЭлементDOM-контейнер и помещайте в него текст/элементы. ТекстDOM сам контейнером не является.
Не переносите правило на АтрибутDOM: его представление значения может включать текстовые дочерние узлы, это другой вид DOM-узла.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.