ОпределениеСоставногоТипаXS.МаскаАтрибутов

Свойства · AttributeWildcard

Тип: МаскаXS. Компонент, определяющий маску атрибутов.

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

ОпределениеСоставногоТипаXS.МаскаАтрибутов (XSComplexTypeDefinition.AttributeWildcard)

ОпределениеСоставногоТипаXS (XSComplexTypeDefinition)

МаскаАтрибутов (AttributeWildcard)

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

Использование:
Чтение и запись.
Описание:
Тип: МаскаXS.
Компонент, определяющий маску атрибутов.
Доступность:

Сервер, толстый клиент, внешнее соединение.

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

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

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

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

Проверить разные маски элементов и атрибутов

xs:any разрешает два пространства имён, xs:anyAttribute только partner. Проверяем Допускает по URI, не по похожему префиксу.

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

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

Подготовка

  1. Фрагменты запускайте по отдельности на сервере учебной базы. Полная собственная XSD Envelope включена в код, внешние данные и схемы не загружаются.

  2. Маска элементов разрешает только два собственных URN, маска атрибутов один. lax и skip — способы обработки содержимого XSD, а не отключение безопасного XML-парсинга.

  3. Набор.Проверить проверяет структуру XSD. Примеры не заявляют, что проверен XML-экземпляр с неизвестными элементами.

XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:envelope"" targetNamespace=""urn:guide:envelope"" elementFormDefault=""qualified"">
| <xs:complexType name=""Envelope""><xs:sequence>
|  <xs:any namespace=""urn:guide:partner urn:guide:labels"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
| </xs:sequence><xs:anyAttribute namespace=""urn:guide:partner"" processContents=""skip""/></xs:complexType>
| <xs:element name=""envelope"" type=""g:Envelope""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    ЧтениеДерева = Новый ПостроительDOM;
    ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипКонверта = Схема.ОпределенияТипов.Получить("Envelope", "urn:guide:envelope");
Если ТипЗнч(ТипКонверта) <> Тип("ОпределениеСоставногоТипаXS") Тогда
    ВызватьИсключение "Не получен собственный составной тип Envelope";
КонецЕсли;
Фрагмент = ТипКонверта.Содержимое;
Если ТипЗнч(Фрагмент) <> Тип("ФрагментXS") Тогда
    ВызватьИсключение "Ожидалась собственная модель sequence";
КонецЕсли;
Группа = Фрагмент.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Тогда
    ВызватьИсключение "Нет модели собственного конверта";
КонецЕсли;
Если Группа.Фрагменты.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный xs:any";
КонецЕсли;
МаскаЭлементов = Группа.Фрагменты.Получить(0).Часть;
МаскаАтрибутов = ТипКонверта.МаскаАтрибутов;
Если ТипЗнч(МаскаЭлементов) <> Тип("МаскаXS") Или ТипЗнч(МаскаАтрибутов) <> Тип("МаскаXS") Тогда
    ВызватьИсключение "Не получены собственные маски элементов и атрибутов";
КонецЕсли;
Сообщить(МаскаЭлементов.Допускает("urn:guide:partner"));
Сообщить(МаскаЭлементов.Допускает("urn:guide:labels"));
Сообщить(Не МаскаЭлементов.Допускает("urn:guide:unknown"));
Сообщить(МаскаАтрибутов.Допускает("urn:guide:partner"));
Сообщить(Не МаскаАтрибутов.Допускает("urn:guide:labels"));
Сообщить(МаскаЭлементов.ВидОбработкиСодержимого = ОбработкаСодержимогоXS.Слабая);
Сообщить(МаскаАтрибутов.ВидОбработкиСодержимого = ОбработкаСодержимогоXS.Пропустить);
Сообщить(МаскаЭлементов.КатегорияОграниченияПространствИмен = КатегорияОграниченияПространствИменXS.Набор);
Сообщить(МаскаЭлементов.ОграничениеПространствИмен().Количество() = 2);
Сообщить(МаскаАтрибутов.ОграничениеПространствИмен().Количество() = 1);
Сообщить("Лексическая запись: " + МаскаЭлементов.ЛексическоеЗначениеОграниченияПространствИмен);

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

  1. Составной тип, фрагмент и модель проверены по точному типу, количество фрагментов проверено до доступа к индексу 0.

  2. Маска элементов берётся из sequence, маска атрибутов из отдельного свойства типа.

  3. Допускает сравнивает URI пространства имён. Не требуется передавать XML-префиксы или имена элементов.

  4. ВидОбработкиСодержимого читается независимо: у элементов Слабая, у атрибутов Пропустить.

  5. ОграничениеПространствИмен возвращает массив разрешённых URI, лексическая запись — строковое представление правила.

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

  1. Десять сравнений Истина и одна диагностическая строка.

  2. labels разрешён для элементов, но не для атрибутов.

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

Обе маски и их способы обработки прочитаны на конкретном контракте.

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

  1. Допускает не проверяет тип или содержимое конкретного XML-элемента.

  2. skip не разрешает DTD, внешние сущности или загрузку URL автоматически.

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

Сравнить узкую и широкую маски по направлению подмножества

Новая отдельная маска partner является подмножеством списка partner/labels. Обратное включение неверно.

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

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

Подготовка

  1. Фрагменты запускайте по отдельности на сервере учебной базы. Полная собственная XSD Envelope включена в код, внешние данные и схемы не загружаются.

  2. Маска элементов разрешает только два собственных URN, маска атрибутов один. lax и skip — способы обработки содержимого XSD, а не отключение безопасного XML-парсинга.

  3. Набор.Проверить проверяет структуру XSD. Примеры не заявляют, что проверен XML-экземпляр с неизвестными элементами.

XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:envelope"" targetNamespace=""urn:guide:envelope"" elementFormDefault=""qualified"">
| <xs:complexType name=""Envelope""><xs:sequence>
|  <xs:any namespace=""urn:guide:partner urn:guide:labels"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
| </xs:sequence><xs:anyAttribute namespace=""urn:guide:partner"" processContents=""skip""/></xs:complexType>
| <xs:element name=""envelope"" type=""g:Envelope""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    ЧтениеДерева = Новый ПостроительDOM;
    ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипКонверта = Схема.ОпределенияТипов.Получить("Envelope", "urn:guide:envelope");
Если ТипЗнч(ТипКонверта) <> Тип("ОпределениеСоставногоТипаXS") Тогда
    ВызватьИсключение "Не получен собственный составной тип Envelope";
КонецЕсли;
Фрагмент = ТипКонверта.Содержимое;
Если ТипЗнч(Фрагмент) <> Тип("ФрагментXS") Тогда
    ВызватьИсключение "Ожидалась собственная модель sequence";
КонецЕсли;
Группа = Фрагмент.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Тогда
    ВызватьИсключение "Нет модели собственного конверта";
КонецЕсли;
Если Группа.Фрагменты.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный xs:any";
КонецЕсли;
МаскаЭлементов = Группа.Фрагменты.Получить(0).Часть;
МаскаАтрибутов = ТипКонверта.МаскаАтрибутов;
Если ТипЗнч(МаскаЭлементов) <> Тип("МаскаXS") Или ТипЗнч(МаскаАтрибутов) <> Тип("МаскаXS") Тогда
    ВызватьИсключение "Не получены собственные маски элементов и атрибутов";
КонецЕсли;
Узкая = Новый МаскаXS;
Узкая.ЛексическоеЗначениеОграниченияПространствИмен = "urn:guide:partner";
Узкая.ВидОбработкиСодержимого = ОбработкаСодержимогоXS.Слабая;
Сообщить(Узкая.Допускает("urn:guide:partner"));
Сообщить(Не Узкая.Допускает("urn:guide:labels"));
Сообщить(Узкая.ЭтаМаскаПодмножество(МаскаЭлементов));
Сообщить(Не МаскаЭлементов.ЭтаМаскаПодмножество(Узкая));
Сообщить(Узкая.ЭтаМаскаПодмножество(Узкая));
Сообщить(Узкая.ОграничениеПространствИмен().Количество() = 1);

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

  1. Конструктор создаёт новую маску, не присоединяет её к Envelope.

  2. Задаём явный URI partner без специальных ##targetNamespace, чтобы не зависеть от отсутствующего контейнера новой маски.

  3. Узкая.ЭтаМаскаПодмножество(Широкая) проверяет направление от текущего объекта к переданному.

  4. Обратное направление Ложь: широкая разрешает labels, узкая не разрешает.

  5. Маска является подмножеством самой себя. Это отношения пространств имён, не сравнение количества книг или прав доступа.

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

  1. Шесть сообщений Истина.

  2. Явно показано направление подмножества и отсутствие второго разрешённого URI.

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

Новая маска использована для настоящего сравнения правил namespace.

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

  1. Не меняйте направление вызова местами.

  2. Сравнение пространств имён не проверяет данные XML-экземпляра.

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

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

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

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

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