СписокСтрокDOM

Типы · DOMStringList

Список строк DOM.

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

СписокСтрокDOM (DOMStringList)

СписокСтрокDOM (DOMStringList)

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

Методы:
Количество (Count)
Содержит (Contains)
Элемент (Item)

Описание:

Список строк DOM.

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

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

См. также:
КонфигурацияДокументаDOM, свойство ИменаПараметров
КонфигурацияПостроителяDOM, свойство ИменаПараметров
КонфигурацияЗаписиDOM, свойство ИменаПараметров

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

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

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

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

Запретить DTD при разборе собственной XML-строки

Проверяем положительный вход без DOCTYPE и отрицательный с локальным пустым объявлением. disallow-doctype — настройка построителя, а не поиск подстроки в произвольном XML.

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

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

Подготовка

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

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

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

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

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

  1. Получаем настройки конкретного ПостроительDOM. ИменаПараметров — СписокСтрокDOM, не обычный Массив: используются Содержит, Количество, Элемент.

  2. Перед изменением проверяем возможность установки, сохраняем прежнее значение и включаем disallow-doctype. Если включение невозможно, пример прекращает разбор.

  3. Вспомогательная функция создаёт и закрывает собственное ЧтениеXML. Положительная строка даёт products с текстом Книга.

  4. Отрицательная строка содержит только собственный DOCTYPE без SYSTEM/PUBLIC и сущностей. Ожидается исключение; факт отказа проверяется вне внутреннего блока Попытка, чтобы не поймать собственную контрольную ошибку.

  5. Прежняя настройка восстанавливается при завершении и при ошибке; это не отменяет уже построенный положительный документ.

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

  1. Проверки наличия disallow-doctype, корня, текста, отказа и восстановления дают Истина.

  2. Сообщение ожидаемого отказа отображает фактическую ошибку платформы; конкретную формулировку не сравниваем.

  3. Ни одна строка не содержит адреса внешнего DTD или файловой ссылки.

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

Отработана защитная настройка разбора XML с положительным и отрицательным учебным входом.

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

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

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

  3. ПолучитьПараметр с неизвестным именем может вызвать исключение; сначала используйте список имён и проверку возможности установки.

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

Склеить соседний 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С» и не аффилирован с ней.