СущностьDOM.НайтиПрефикс

Методы · LookupPrefix

Производит поиск префикса для URI пространства имен, начиная с данного узла. Алгоритм поиска префикса описан в спецификации DOM Core.

Синтаксис

НайтиПрефикс(<URIПространстваИмен>)
Полное описание, параметры и ограничения

СущностьDOM.НайтиПрефикс (DOMEntity.LookupPrefix)

СущностьDOM (DOMEntity)

НайтиПрефикс (LookupPrefix)

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

Синтаксис:
НайтиПрефикс(<URIПространстваИмен>)
Параметры:

<URIПространстваИмен> (обязательный)
Тип: Строка.
URI пространства имен, префикс которого необходимо найти.
Возвращаемое значение:
Тип: Строка.

Описание:

Производит поиск префикса для URI пространства имен, начиная с данного узла. Алгоритм поиска префикса описан в спецификации DOM Core.

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

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

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

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

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

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

Не спутать имена DTD с пространствами имён элементов

У корневого элемента объявлен префикс g. Объявления guideIcon/guideMark не превращаются в g:элементы из-за владения тем же документом.

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

Полный серверный общий модуль своей учебной базы. Внутренний DTD только известной собственной строки, не вход произвольного API.

Подготовка

  1. Только отдельная учебная база. Создайте серверный общий модуль УчебныеЗадачи с процедурой ВыполнитьПример() Экспорт. Полный модуль каждого урока вставьте целиком, включая уже показанную процедуру.

  2. XML содержит только собственный внутренний DTD. Внешнего подмножества DOCTYPE нет, SYSTEM/PUBLIC в двух объявлениях — учебные URN, не пути и не HTTP-адреса.

  3. guideIcon — неразбираемая сущность NDATA; она объявлена, но не используется как &guideIcon; в тексте. Её ресурс не загружается. Нотация описывает формат, не изображение.

  4. Параметры и построитель создаются заново для этой известной строки. Никогда не переносите разрешение DTD на произвольный XML из интернета или API.

  5. Вызовите УчебныеЗадачи.ВыполнитьПример() из серверной учебной команды. Нет записи базы, файлов или сетевых соединений; поведение DOM 1С ещё требует контрольного запуска в учебной базе.

Процедура ВыполнитьПример() Экспорт
    Параметры = Новый ПараметрыЧтенияXML(, , , , , Ложь);
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку("<?xml version=""1.0""?>
    |<!DOCTYPE products [
    |<!NOTATION guideMark PUBLIC ""guide-marker"" ""urn:guide:marker-format"">
    |<!ENTITY guideIcon SYSTEM ""urn:guide:marker-payload"" NDATA guideMark>
    |]>
    |<products xmlns:g=""urn:guide:dtd""><product>Книга</product></products>", Параметры);
    Построитель = Новый ПостроительDOM;
    Настройки = Построитель.КонфигурацияDOM;
    Если НЕ Настройки.ВозможноУстановитьПараметр("disallow-doctype", Ложь) Тогда
        Чтение.Закрыть();
        ВызватьИсключение "Построитель не разрешает собственный внутренний DTD";
    КонецЕсли;
    Настройки.УстановитьПараметр("disallow-doctype", Ложь);
    Попытка
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    ОписаниеТипа = Документ.ОпределениеТипаДокумента;
    Если ОписаниеТипа = Неопределено Тогда
        ВызватьИсключение "Включите чтение типа документа, не подменяйте его пустым новым DOCTYPE";
    КонецЕсли;
    Сущность = ОписаниеТипа.Сущности.ПолучитьИменованныйЭлемент("guideIcon");
    Нотация = ОписаниеТипа.Нотации.ПолучитьИменованныйЭлемент("guideMark");
    Если ТипЗнч(Сущность) <> Тип("СущностьDOM") ИЛИ ТипЗнч(Нотация) <> Тип("НотацияDOM") Тогда
        ВызватьИсключение "Построитель не сохранил ожидаемые собственные объявления DTD";
    КонецЕсли;
    Узлы = Новый Массив;
    Узлы.Добавить(Сущность);
    Узлы.Добавить(Нотация);
    Корень = Документ.ЭлементДокумента;
    Сообщить(Корень.НайтиURIПространстваИмен("g") = "urn:guide:dtd");
    Для Каждого Узел Из Узлы Цикл
        Сообщить("Имя DTD: " + Узел.ИмяУзла);
        Сообщить("Локальное имя: " + Строка(Узел.ЛокальноеИмя));
        Сообщить("Префикс: " + Строка(Узел.Префикс));
        Сообщить("URI узла: " + Строка(Узел.URIПространстваИмен));
        Сообщить("Поиск g от этого узла: " + Строка(Узел.НайтиURIПространстваИмен("g")));
        Сообщить("Поиск префикса URI: " + Строка(Узел.НайтиПрефикс("urn:guide:dtd")));
        Сообщить("Этот URI по умолчанию: " + Строка(Узел.ПространствоИменПоУмолчанию("urn:guide:dtd")));
    КонецЦикла;
    Сообщить(Корень.ТекстовоеСодержимое = "Книга");
КонецПроцедуры

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

  1. Объявление xmlns:g находится на корневом элементе products. Положительная проверка поиска URI выполняется именно от него.

  2. ЛокальноеИмя, Префикс и URIПространстваИмен узлов DTD диагностируются отдельно от ИмяУзла.

  3. НайтиURIПространстваИмен и НайтиПрефикс начинают поиск от конкретного узла. Владение документом само по себе не делает корень родителем объявления DTD.

  4. Результаты трёх поисков от сущности/нотации выводятся фактически; не обещается наследование g только из-за общего документа. Ничего не переименовывается.

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

  1. Два контрольных Истина, между ними диагностические результаты двух узлов.

  2. guideIcon и guideMark сохранили свои имена, текст корня остался Книга.

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

Пространства имён элементов отделены от имён объявлений DTD.

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

  1. Не присваивайте Префикс узлу DTD, чтобы якобы связать его с xmlns:g.

  2. Возвращённый URI — не команда загрузки схемы или файла.

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

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

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

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

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