ЭлементDOM.НайтиURIПространстваИмен

Методы · LookupNamespaceURI

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

Синтаксис

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

ЭлементDOM.НайтиURIПространстваИмен (DOMElement.LookupNamespaceURI)

ЭлементDOM (DOMElement)

НайтиURIПространстваИмен (LookupNamespaceURI)

Доступен, начиная с версии 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 — не команда загрузки схемы или файла.

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

Найти пространство имён от текста, атрибута и отсоединённого фрагмента

Поиск namespace учитывает положение узла, а не только его ДокументВладелец. Восемь видов узлов показывают наследование от корня и отсутствие такого контекста у отдельного фрагмента.

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

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

Подготовка

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

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

Документ = Новый ДокументDOM("urn:guide:nodes", "g:guide");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", "urn:guide:nodes");
Атрибут = Документ.СоздатьАтрибут("code");
Атрибут.Значение = "A-01";
Корень.УстановитьУзелАтрибута(Атрибут);
Текст = Документ.СоздатьТекстовыйУзел("Книга");
Комментарий = Документ.СоздатьКомментарий("учебный комментарий");
CDATA = Документ.СоздатьСекциюCDATA("<данные>");
Инструкция = Документ.СоздатьИнструкциюОбработки("guide", "mode=test");
Корень.ДобавитьДочерний(Текст);
Корень.ДобавитьДочерний(Комментарий);
Корень.ДобавитьДочерний(CDATA);
Корень.ДобавитьДочерний(Инструкция);
Фрагмент = Документ.СоздатьФрагментДокумента();
Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("note"));
Узлы = Новый Массив;
Узлы.Добавить(Документ);
Узлы.Добавить(Корень);
Узлы.Добавить(Атрибут);
Узлы.Добавить(Текст);
Узлы.Добавить(Комментарий);
Узлы.Добавить(CDATA);
Узлы.Добавить(Инструкция);
Узлы.Добавить(Фрагмент);
URI = "urn:guide:nodes";
Корень.УстановитьСоответствиеПространстваИмен("", URI);
Для Каждого Узел Из Узлы Цикл
    НайденныйURI = Узел.НайтиURIПространстваИмен("g");
    НайденныйПрефикс = Узел.НайтиПрефикс(URI);
    ЭтоПоУмолчанию = Узел.ПространствоИменПоУмолчанию(URI);
    Сообщить(СтрШаблон("%1 / %2: g → %3, префикс URI → %4", ТипЗнч(Узел), Узел.ИмяУзла,
        Строка(НайденныйURI), Строка(НайденныйПрефикс)));
    Если Узел.УзелИдентичен(Фрагмент) Тогда
        Сообщить(НайденныйURI = Неопределено);
        Сообщить(Не ЭтоПоУмолчанию);
    Иначе
        Сообщить(НайденныйURI = URI);
        Сообщить(НайденныйПрефикс = "g");
        Сообщить(ЭтоПоУмолчанию);
    КонецЕсли;
КонецЦикла;
Сообщить(Фрагмент.ДокументВладелец = Документ);
Сообщить(Фрагмент.РодительскийУзел = Неопределено);

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

  1. Корень g:guide объявляет g и пространство по умолчанию с одним URI. Текст, комментарий, CDATA и инструкция являются его детьми; атрибут принадлежит корню через ЭлементВладелец.

  2. НайтиURIПространстваИмен ищет соответствие от данного узла. Для документа используется корневой элемент, для атрибута — его элемент-владелец, для прикреплённых листьев — родитель.

  3. НайтиПрефикс ищет именно именованный префикс g; пустой префикс по умолчанию не заменяет его. ПространствоИменПоУмолчанию отдельно проверяет URI.

  4. Фрагмент не присоединён к корню. Наличие того же ДокументВладелец не заставляет его наследовать объявления корня.

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

  1. Для первых семи видов проверки URI, g и пространства по умолчанию дают Истина.

  2. Для отсоединённого фрагмента URI по g не найден, проверка пространства по умолчанию ложная; две проверки этой ветки дают Истина.

  3. В конце подтверждаются общий документ-владелец фрагмента и отсутствие родителя.

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

На конкретном дереве разобраны контекст поиска namespace у разных видов DOM-узлов.

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

  1. URIПространстваИмен самого текстового/комментарного узла не равен результату поиска объявленного URI от его родителя.

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

  3. Присвоение объявления namespace не переименовывает уже созданные элементы и атрибуты; их собственные имена/URI задаются отдельно.

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

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

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

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

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