Список строк DOM.
Полное описание, параметры и ограничения
СписокСтрокDOM (DOMStringList)
СписокСтрокDOM (DOMStringList)
Доступен, начиная с версии 8.1.
Методы:
Количество (Count)
Содержит (Contains)
Элемент (Item)
Описание:
Список строк DOM.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
КонфигурацияДокументаDOM, свойство ИменаПараметров
КонфигурацияПостроителяDOM, свойство ИменаПараметров
КонфигурацияЗаписиDOM, свойство ИменаПараметров
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Запретить DTD при разборе собственной XML-строки
Проверяем положительный вход без DOCTYPE и отрицательный с локальным пустым объявлением. disallow-doctype — настройка построителя, а не поиск подстроки в произвольном XML.
Где и как запускать
Полный текст собственного серверного общего модуля УчебныеЗадачи. Замените его учебное содержимое всем кодом ниже: процедура ВыполнитьПример уже включена, вспомогательная функция размещается после неё, не внутри процедуры.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.
У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.
Процедура ВыполнитьПример() Экспорт
Построитель = Новый ПостроительDOM;
Настройки = Построитель.КонфигурацияDOM;
Имена = Настройки.ИменаПараметров;
Сообщить(Имена.Содержит("disallow-doctype"));
Для Индекс = 0 По Имена.Количество() - 1 Цикл
Сообщить("Параметр построителя: " + Имена.Элемент(Индекс));
КонецЦикла;
Если Не Настройки.ВозможноУстановитьПараметр("disallow-doctype", Истина) Тогда
ВызватьИсключение "Нельзя включить запрет DTD: разбор не выполняется";
КонецЕсли;
Прежнее = Настройки.ПолучитьПараметр("disallow-doctype");
Настройки.УстановитьПараметр("disallow-doctype", Истина);
Попытка
Документ = ПрочитатьУчебнуюСтроку(Построитель, "<products><product>Книга</product></products>");
Сообщить(Документ.ЭлементДокумента.ИмяЭлемента = "products");
Сообщить(Документ.ЭлементДокумента.ПервыйДочерний.ТекстовоеСодержимое = "Книга");
ОтклонёнDTD = Ложь;
Попытка
СDTD = ПрочитатьУчебнуюСтроку(Построитель, "<!DOCTYPE products><products/>");
Исключение
ОтклонёнDTD = Истина;
Сообщить("Ожидаемый отказ для DOCTYPE: " + ОписаниеОшибки());
КонецПопытки;
Если Не ОтклонёнDTD Тогда
ВызватьИсключение "Отрицательная проверка не пройдена: DOCTYPE был принят";
КонецЕсли;
Сообщить(ОтклонёнDTD);
Исключение
Настройки.УстановитьПараметр("disallow-doctype", Прежнее);
ВызватьИсключение;
КонецПопытки;
Настройки.УстановитьПараметр("disallow-doctype", Прежнее);
Сообщить(Настройки.ПолучитьПараметр("disallow-doctype") = Прежнее);
КонецПроцедуры
Функция ПрочитатьУчебнуюСтроку(Построитель, ТекстXML)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
Попытка
Результат = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Возврат Результат;
КонецФункции
Разбор по шагам
Получаем настройки конкретного ПостроительDOM. ИменаПараметров — СписокСтрокDOM, не обычный Массив: используются Содержит, Количество, Элемент.
Перед изменением проверяем возможность установки, сохраняем прежнее значение и включаем disallow-doctype. Если включение невозможно, пример прекращает разбор.
Вспомогательная функция создаёт и закрывает собственное ЧтениеXML. Положительная строка даёт products с текстом Книга.
Отрицательная строка содержит только собственный DOCTYPE без SYSTEM/PUBLIC и сущностей. Ожидается исключение; факт отказа проверяется вне внутреннего блока Попытка, чтобы не поймать собственную контрольную ошибку.
Прежняя настройка восстанавливается при завершении и при ошибке; это не отменяет уже построенный положительный документ.
Как проверить результат
Проверки наличия disallow-doctype, корня, текста, отказа и восстановления дают Истина.
Сообщение ожидаемого отказа отображает фактическую ошибку платформы; конкретную формулировку не сравниваем.
Ни одна строка не содержит адреса внешнего DTD или файловой ссылки.
Ожидаемый результат
Отработана защитная настройка разбора XML с положительным и отрицательным учебным входом.
На что обратить внимание
Это не полный набор ограничений обработки недоверенного XML: отдельно нужны ограничения размера, времени, схемы и допустимых полей.
Не выключайте запрет для внешнего пользовательского XML ради успешного чтения. Для легитимного DTD требуется отдельная политика безопасных источников.
ПолучитьПараметр с неизвестным именем может вызвать исключение; сначала используйте список имён и проверку возможности установки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Склеить соседний XML-текст и отдельно управлять комментариями
Нормализация объединяет соседние текстовые узлы. Дополнительное удаление комментариев зависит от поддержки параметра comments; обе ветки результата объяснены.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.
У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.
Документ = Новый ДокументDOM("", "product");
Корень = Документ.ЭлементДокумента;
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Кни"));
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(""));
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("га"));
Корень.ДобавитьДочерний(Документ.СоздатьКомментарий("Учебная заметка"));
Сообщить(Корень.ДочерниеУзлы.Количество() = 4);
Настройки = Документ.КонфигурацияDOM;
Имена = Настройки.ИменаПараметров;
Для Индекс = 0 По Имена.Количество() - 1 Цикл
Сообщить("Параметр документа: " + Имена.Элемент(Индекс));
КонецЦикла;
УдалятьКомментарии = Имена.Содержит("comments") И Настройки.ВозможноУстановитьПараметр("comments", Ложь);
Если УдалятьКомментарии Тогда
Прежнее = Настройки.ПолучитьПараметр("comments");
Настройки.УстановитьПараметр("comments", Ложь);
Попытка
Документ.НормализоватьДокумент();
Исключение
Настройки.УстановитьПараметр("comments", Прежнее);
ВызватьИсключение;
КонецПопытки;
Настройки.УстановитьПараметр("comments", Прежнее);
Сообщить(Настройки.ПолучитьПараметр("comments") = Прежнее);
Иначе
Сообщить("Удаление комментариев настройкой не поддерживается; нормализуем только текст обычным методом");
Документ.Нормализовать();
КонецЕсли;
Сообщить(Корень.ПервыйДочерний.ТекстовоеСодержимое = "Книга");
Сообщить(Корень.ТекстовоеСодержимое = "Книга");
Если УдалятьКомментарии Тогда
Сообщить(Корень.ДочерниеУзлы.Количество() = 1);
Иначе
Сообщить(Корень.ДочерниеУзлы.Количество() = 2);
КонецЕсли;Разбор по шагам
Вручную создаём три соседних текста, включая пустой, и комментарий. До нормализации это четыре ребёнка, хотя текстовое содержимое уже равно Книга.
Запрашиваем ИменаПараметров у документа. Значение comments из стандарта DOM проверяем на поддержку в этой платформе перед чтением и присваиванием.
Если поддерживается comments=Ложь, НормализоватьДокумент объединяет текст и удаляет комментарий. Иначе обычный Нормализовать объединяет текст, сохраняя комментарий.
Настройку восстанавливаем, но восстановление параметра не возвращает удалённый комментарий. Сам документ был изменён.
Как проверить результат
Начальная проверка четырёх детей и обе проверки текста дают Истина.
При поддержке comments после нормализации один текстовый ребёнок. Без поддержки — текст и комментарий, всего два; соответствующая проверка Истина.
В ветке comments также проверяется восстановление прежнего значения настройки.
Ожидаемый результат
Показано различие нормальной формы текста и дополнительной политики обработки комментариев.
На что обратить внимание
Смысл comments=Ложь определён DOM Level 3 Core, а поддержку и допустимость значения проверяет текущая платформа: https://www.w3.org/TR/DOM-Level-3-Core/core.html#DOMConfiguration .
НормализоватьДокумент не является проверкой бизнес-схемы товара и не делает недоверенный текст безопасным HTML.
Если нужно сохранить исходное дерево, нормализуйте его полную копию, а не рабочий оригинал.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.