ЧтениеXML.Префикс

Свойства · Prefix

Тип: Строка. Префикс пространства имен, ассоциированного с текущим узлом.

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

ЧтениеXML.Префикс (XMLReader.Prefix)

ЧтениеXML (XMLReader)

Префикс (Prefix)

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

Использование:
Только чтение.
Описание:
Тип: Строка.
Префикс пространства имен, ассоциированного с текущим узлом.
Доступность:

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

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

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

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

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

Записать и прочитать XML с пространством имён

Префикс p — сокращение, URI urn:amadesk:products — настоящее имя пространства. Для поиска проверяем URI и локальное имя.

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

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

Подготовка

  1. Серверный контекст, документ формируется в памяти.

  2. URI здесь — идентификатор учебного формата, а не адрес, на который будет выполнен сетевой запрос.

URI = "urn:amadesk:products";
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Попытка
    Запись.ЗаписатьНачалоЭлемента("p:product");
    Запись.ЗаписатьСоответствиеПространстваИмен("p", URI);
    Запись.ЗаписатьАтрибут("code", "A-01");
    Запись.ЗаписатьАтрибут("p:status", "active");
    Сообщить(Запись.НайтиПрефикс(URI));
    Запись.ЗаписатьНачалоЭлемента("p:name");
    Запись.ЗаписатьТекст("Книга");
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    ТекстXML = Запись.Закрыть();
Исключение
    Запись.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
Попытка
    Пока Чтение.Прочитать() Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента
                И Чтение.URIПространстваИмен = URI
                И Чтение.ЛокальноеИмя = "product" Тогда
            Сообщить(Чтение.Имя);
            Сообщить(Чтение.Префикс);
            Сообщить(Чтение.ЗначениеАтрибута("status", URI));
            Для Номер = 0 По Чтение.КоличествоАтрибутов() - 1 Цикл
                Сообщить(Чтение.ЛокальноеИмяАтрибута(Номер));
                Сообщить(Чтение.URIПространстваИменАтрибута(Номер));
                Сообщить(Чтение.ПрефиксАтрибута(Номер));
                Сообщить(Чтение.ТипАтрибута(Номер));
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();

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

  1. Создаём имя p:product и объявляем соответствие префикса p пространству URI.

  2. Непрефиксный code не принадлежит этому пространству; p:status принадлежит.

  3. При чтении сравниваем ЛокальноеИмя и URIПространстваИмен, не только текст p:product.

  4. Для атрибутов смотрим локальное имя, URI и префикс по индексу.

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

  1. НайтиПрефикс выдаёт p; значение атрибута status в заданном URI — active.

  2. Согласованно замените префикс p на item при записи: проверка по URI и локальному имени продолжит находить товар.

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

Товар найден независимо от выбранного сокращения пространства имён.

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

  1. Порядок аргументов ЗначениеАтрибута здесь: локальное имя, URI. У DOM аналогичный метод может принимать URI раньше имени.

  2. Пространство по умолчанию для элементов не распространяется автоматически на непрефиксные атрибуты.

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

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