КонтекстПространствИменXML.НайтиПрефикс

Методы · LookupPrefix

Получает префикс по URI пространства имен.

Синтаксис

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

КонтекстПространствИменXML.НайтиПрефикс (XMLNamespaceContext.LookupPrefix)

КонтекстПространствИменXML (XMLNamespaceContext)

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

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

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

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

Получает префикс по URI пространства имен.

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

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

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

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

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

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

Проверить смену пространства имён и наследование xml:lang/xml:space

Один префикс m можно переопределить во вложенном элементе. Действующее соответствие берём из текущего контекста; язык и режим пробелов наследуются отдельно.

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

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

Подготовка

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

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

  3. В этом блоке каждый пример создаёт собственное дерево DOM в памяти. Файлы, сеть, данные документов и справочников не используются.

  4. Открыть у ЧтениеУзловDOM принимает узел, а у ЗаписьУзловDOM — документ-владелец будущих узлов. Это не открытие файла.

URI = "urn:guide:products";
Документ = Новый ДокументDOM(URI, "g:products");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", URI);
Корень.УстановитьСоответствиеПространстваИмен("m", "urn:guide:units");
ЯзыкXML = Документ.СоздатьАтрибут("http://www.w3.org/XML/1998/namespace", "xml:lang");
ЯзыкXML.Значение = "ru";
Корень.УстановитьУзелАтрибута(ЯзыкXML);
ПробелыXML = Документ.СоздатьАтрибут("http://www.w3.org/XML/1998/namespace", "xml:space");
ПробелыXML.Значение = "preserve";
Корень.УстановитьУзелАтрибута(ПробелыXML);
Примечание = Документ.СоздатьЭлемент("urn:guide:notes", "m:note");
Примечание.УстановитьСоответствиеПространстваИмен("m", "urn:guide:notes");
Примечание.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("  Книга  "));
Корень.ДобавитьДочерний(Примечание);
Чтение = Новый ЧтениеУзловDOM;
Чтение.Открыть(Документ);
Попытка
    Чтение.ПерейтиКСодержимому();
    Контекст = Чтение.КонтекстПространствИмен;
    Сообщить(Контекст.НайтиURIПространстваИмен("m") = "urn:guide:units");
    Сообщить(Контекст.ПространствоИменПоУмолчанию = "");
    Если Не Чтение.Прочитать() Тогда
        ВызватьИсключение "Нет собственного m:note";
    КонецЕсли;
    Контекст = Чтение.КонтекстПространствИмен;
    Сообщить(Контекст.НайтиURIПространстваИмен("m") = "urn:guide:notes");
    Сообщить(Контекст.НайтиПрефикс(URI) = "g");
    Сообщить(Контекст.НайтиURIПространстваИмен("missing") = Неопределено);
    Сообщить(Контекст.URIПространствИмен().Найти("urn:guide:notes") <> Неопределено);
    Сообщить(Контекст.Префиксы("urn:guide:notes").Найти("m") <> Неопределено);
    Соответствия = Контекст.СоответствияПространствИмен();
    Сообщить(Соответствия.Получить("m") = "urn:guide:notes");
    Сообщить("Глубина текущего контекста: " + Строка(Контекст.Глубина));
    Сообщить(Чтение.Язык = "ru");
    Сообщить(Чтение.ПробельныеСимволы = ПробельныеСимволыXML.Сохранять);
    Если Не Чтение.Прочитать() Тогда
        ВызватьИсключение "Нет текста заметки";
    КонецЕсли;
    Сообщить(Чтение.Значение = "  Книга  ");
    Сообщить(Чтение.ЭтоСимвольныеДанные);
    Сообщить(Не Чтение.ЭтоПробельныеСимволы);
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();

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

  1. Корень объявляет g для товаров и m для единиц. Внутри note тот же m локально переназначен URI заметок.

  2. На текущем note перечитываем КонтекстПространствИмен. Сопоставление родителя нельзя использовать как вечный снимок контекста.

  3. URIПространствИмен и Префиксы возвращают массивы; СоответствияПространствИмен показывает объявления текущего элемента. Проверяем наличие нужных значений, а не точный размер всех служебных соответствий.

  4. xml:lang=ru и xml:space=preserve наследуются от корня. Значение текста сохраняет два пробела по краям, но не состоит только из пробельных символов.

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

  1. Тринадцать логических проверок дают Истина; глубина выводится отдельно как число.

  2. Для note m соответствует urn:guide:notes, g по-прежнему соответствует URI товаров.

  3. Значение текста содержит ровно два пробела до и после Книга; язык ru, режим пробелов Сохранять.

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

Разобраны вложенная область namespace-сопоставлений и независимое наследование XML-атрибутов.

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

  1. xml:space=preserve сообщает приложению правило обработки пробелов, а не превращает текст в число или автоматически очищает его.

  2. Объявленный префикс не меняет задним числом URI уже созданного DOM-элемента: note создаётся сразу с нужным URI.

  3. Не рассчитывайте на фиксированный порядок массивов пространств или наличие только двух пользовательских префиксов.

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

Прочитать контекст URI, языка и xml:space на двух уровнях

У корня свои default/g/x пространства, язык ru и абсолютный учебный xml:base. У product язык en; URI и настройки контекста наследуются, но префикс g не заменяет URI.

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

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

Подготовка

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

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

  3. Ни один фрагмент не пишет товары, документы и настройки конфигурации. Файловое упражнение отдельно предупреждает о создании только собственного временного XSD.

  4. Проверки сообщениями ожидают Истина. XML-текст и объекты можно исследовать в отладчике; это не контракт Avito, SOAP или обмен типовой конфигурации.

XML = "<catalog xmlns=""urn:guide:catalog"" xmlns:g=""urn:guide:goods"" xmlns:x=""urn:guide:goods"" xml:lang=""ru"" xml:space=""preserve"" xml:base=""urn:guide:base""><g:product xml:lang=""en"">Book</g:product></catalog>";
Параметры = Новый ПараметрыЧтенияXML;
Чтение = Новый ЧтениеXML;
Попытка
    Чтение.УстановитьСтроку(XML, Параметры);
    Если Не Чтение.ПерейтиКСодержимому() Или Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
        ВызватьИсключение "Не найдено начало собственного корня";
    КонецЕсли;
    Сообщить(Чтение.Язык = "ru");
    Сообщить(Чтение.ПробельныеСимволы = ПробельныеСимволыXML.Сохранять);
    Сообщить(Чтение.БазовыйURI = "urn:guide:base");
    Контекст = Чтение.КонтекстПространствИмен;
    Сообщить(Контекст.ПространствоИменПоУмолчанию = "urn:guide:catalog");
    Сообщить(Контекст.НайтиURIПространстваИмен("g") = "urn:guide:goods");
    Сообщить(Контекст.НайтиURIПространстваИмен("x") = "urn:guide:goods");
    Префиксы = Контекст.Префиксы("urn:guide:goods");
    Сообщить(Префиксы.Найти("g") <> Неопределено И Префиксы.Найти("x") <> Неопределено);
    НайденныйПрефикс = Контекст.НайтиПрефикс("urn:guide:goods");
    Сообщить(Контекст.НайтиURIПространстваИмен(НайденныйПрефикс) = "urn:guide:goods");
    URI = Контекст.URIПространствИмен();
    Сообщить(URI.Найти("urn:guide:catalog") <> Неопределено);
    Соответствия = Контекст.СоответствияПространствИмен();
    Сообщить(Соответствия.Получить("g") = "urn:guide:goods");
    ГлубинаКорня = Контекст.Глубина;
    Если Не Чтение.Прочитать() Тогда
        ВызватьИсключение "Нет собственного product";
    КонецЕсли;
    Сообщить(Чтение.ЛокальноеИмя = "product" И Чтение.Префикс = "g");
    Сообщить(Чтение.URIПространстваИмен = "urn:guide:goods");
    Сообщить(Чтение.Язык = "en");
    Сообщить(Чтение.ПробельныеСимволы = ПробельныеСимволыXML.Сохранять);
    Сообщить(Чтение.КонтекстПространствИмен.Глубина = ГлубинаКорня + 1);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;

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

  1. Читаем xml:lang/xml:space/xml:base на корне, не разыскивая их среди данных товара.

  2. URI g/x одинаковый, поэтому НайтиПрефикс не обязан выбирать именно g; проверяем обратное сопоставление.

  3. URIПространствИмен и Префиксы — коллекции: проверяем вхождение, а не порядок или отсутствие системного xml.

  4. Сохраняем числовую глубину корня до перехода. Новый контекст product проверяем относительно неё.

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

  1. Пятнадцать сравнений Истина. product имеет язык en, пространство goods и глубину на единицу больше корня.

  2. Учебный URN только идентификатор; сеть и файл по нему не открываются.

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

Показано наследование контекста и разница имени/URI/префикса.

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

  1. Контекст привязан к позиции чтения: не считайте сохранённый объект снимком предыдущего узла.

  2. Язык en не переводит текст автоматически, а xml:base не загружает товар из URI.

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

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

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

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

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