ЧтениеXML.ЭтоАтрибутПоУмолчанию

Свойства · IsDefaultAttribute

Тип: Булево. Содержит признак включения значения текущего узла как значения по умолчанию, полученного из DTD или XMLSchema. Имеет смысл только для узла Атрибут.

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

ЧтениеXML.ЭтоАтрибутПоУмолчанию (XMLReader.IsDefaultAttribute)

ЧтениеXML (XMLReader)

ЭтоАтрибутПоУмолчанию (IsDefaultAttribute)

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

Использование:
Только чтение.
Описание:
Тип: Булево.
Содержит признак включения значения текущего узла как значения по умолчанию, полученного из DTD или XMLSchema.
Имеет смысл только для узла Атрибут.
Доступность:

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

Примечание:
Истина - значение атрибута было получено подстановкой значения по умолчанию из DTD или XMLSchema, Ложь - значение было указано явно.
Использование в версии:

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

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

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

Обойти атрибуты курсором и затем перейти к дочернему элементу

ПервыйАтрибут/СледующийАтрибут изменяют текущий узел чтения. Собираем code/quantity по имени, не предполагая порядок атрибутов.

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

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

Подготовка

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

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

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

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

XML = "<product code=""A-01"" quantity=""3""><title>Книга</title></product>";
Параметры = Новый ПараметрыЧтенияXML;
Чтение = Новый ЧтениеXML;
Попытка
    Чтение.УстановитьСтроку(XML, Параметры);
    Если Не Чтение.ПерейтиКСодержимому() Или Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
        ВызватьИсключение "Не найдено начало собственного корня";
    КонецЕсли;
    Атрибуты = Новый Соответствие;
    ЕстьАтрибут = Чтение.ПервыйАтрибут();
    Пока ЕстьАтрибут Цикл
        Сообщить(Чтение.ТипУзла = ТипУзлаXML.Атрибут);
        Сообщить(Чтение.ИмеетИмя И Чтение.ИмеетЗначение);
        Сообщить(Не Чтение.ЭтоАтрибутПоУмолчанию);
        Атрибуты.Вставить(Чтение.Имя, Чтение.Значение);
        ЕстьАтрибут = Чтение.СледующийАтрибут();
    КонецЦикла;
    Сообщить(Атрибуты.Количество() = 2);
    Сообщить(Атрибуты.Получить("code") = "A-01");
    Сообщить(Атрибуты.Получить("quantity") = "3");
    Если Не Чтение.Прочитать() Тогда
        ВызватьИсключение "Ожидался дочерний title";
    КонецЕсли;
    Сообщить(Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "title");
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;

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

  1. Создаём соответствие и начинаем позиционирование только на начале product.

  2. После перехода свойства относятся к текущему атрибуту, не к product.

  3. Значение quantity остаётся строкой "3": числовую конверсию для обмена делают отдельно.

  4. После окончания атрибутов Прочитать продолжает чтение узлов документа; проверяем title.

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

  1. Все десять сравнений Истина: по три на каждый явный атрибут, три для соответствия и одно для title.

  2. Перестановка code/quantity в XML не изменяет итоговое соответствие.

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

Отработано позиционирование на атрибутах без зависимости от их порядка.

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

  1. ЭтоАтрибутПоУмолчанию имеет смысл именно на узле Атрибут.

  2. Прочитать не заменяет СледующийАтрибут: это переход по узлам документа.

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

Различить явный code и подставленный DTD-атрибут kind

Собственный внутренний DTD требует code и задаёт kind=paper по умолчанию. Проверка DTD включена; на каждом атрибуте читается происхождение значения.

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

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

Подготовка

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

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

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

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

XML = "<!DOCTYPE product [<!ELEMENT product (#PCDATA)><!ATTLIST product code CDATA #REQUIRED kind CDATA ""paper""><!ENTITY guide ""Книга""><!NOTATION png SYSTEM ""urn:guide:format:png""><!ENTITY picture SYSTEM ""urn:guide:picture"" NDATA png>]><product code=""A-01"">Книга</product>";
Параметры = Новый ПараметрыЧтенияXML("1.0", "", ПробельныеСимволыXML.ПоУмолчанию, ТипПроверкиXML.ОпределениеТипаДокумента, Истина, Ложь);
Чтение = Новый ЧтениеXML;
Попытка
    Чтение.УстановитьСтроку(XML, Параметры);
    Если Параметры.ТипПроверкиПравильности <> ТипПроверкиXML.ОпределениеТипаДокумента
        Или Параметры.ИгнорироватьТипДокумента Тогда
        ВызватьИсключение "Для этого урока нужна проверка собственного DTD";
    КонецЕсли;
    Если Не Чтение.ПерейтиКСодержимому() Или Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
        ВызватьИсключение "Не найдено начало собственного корня";
    КонецЕсли;
    ЕстьЯвный = Ложь;
    ЕстьПоУмолчанию = Ложь;
    Пока Чтение.ПрочитатьАтрибут() Цикл
        Если Чтение.Имя = "code" Тогда
            ЕстьЯвный = Истина;
            Сообщить(Чтение.Значение = "A-01" И Не Чтение.ЭтоАтрибутПоУмолчанию);
        ИначеЕсли Чтение.Имя = "kind" Тогда
            ЕстьПоУмолчанию = Истина;
            Сообщить(Чтение.Значение = "paper" И Чтение.ЭтоАтрибутПоУмолчанию);
        КонецЕсли;
    КонецЦикла;
    Сообщить(ЕстьЯвный И ЕстьПоУмолчанию);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;

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

  1. Включаем проверку DTD только для приведённой собственной строки без внешних источников.

  2. ПерейтиКСодержимому пропускает DTD и доводит до product, не до его первого атрибута.

  3. Явный code и подставленный kind проверяем по имени и ЭтоАтрибутПоУмолчанию.

  4. Оба атрибута возвращают строки: происхождение и лексическое значение проверяются отдельно.

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

  1. Три сравнения Истина.

  2. Добавьте kind="paper" непосредственно в product: значение прежнее, происхождение default станет Ложь.

  3. Удалите обязательный code: ожидается ошибка DTD-проверки, не успешное заполнение товара.

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

Показано отличие происхождения одинакового значения атрибута.

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

  1. Не обещайте DTD-проверку при ТипПроверкиXML.НетПроверки.

  2. Подставленное значение схемы не доказывает, что поставщик прислал поле явно.

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

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

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

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

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