Тип: КатегорияОграниченияПространствИменXS. Содержит категорию ограничений пространств имен.
Полное описание, параметры и ограничения
МаскаXS.КатегорияОграниченияПространствИмен (XSWildcard.NamespaceConstraintCategory)
МаскаXS (XSWildcard)
КатегорияОграниченияПространствИмен (NamespaceConstraintCategory)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: КатегорияОграниченияПространствИменXS.
Содержит категорию ограничений пространств имен.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Проверить разные маски элементов и атрибутов
xs:any разрешает два пространства имён, xs:anyAttribute только partner. Проверяем Допускает по URI, не по похожему префиксу.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Фрагменты запускайте по отдельности на сервере учебной базы. Полная собственная XSD Envelope включена в код, внешние данные и схемы не загружаются.
Маска элементов разрешает только два собственных URN, маска атрибутов один. lax и skip — способы обработки содержимого XSD, а не отключение безопасного XML-парсинга.
Набор.Проверить проверяет структуру 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);
Сообщить("Лексическая запись: " + МаскаЭлементов.ЛексическоеЗначениеОграниченияПространствИмен);Разбор по шагам
Составной тип, фрагмент и модель проверены по точному типу, количество фрагментов проверено до доступа к индексу 0.
Маска элементов берётся из sequence, маска атрибутов из отдельного свойства типа.
Допускает сравнивает URI пространства имён. Не требуется передавать XML-префиксы или имена элементов.
ВидОбработкиСодержимого читается независимо: у элементов Слабая, у атрибутов Пропустить.
ОграничениеПространствИмен возвращает массив разрешённых URI, лексическая запись — строковое представление правила.
Как проверить результат
Десять сравнений Истина и одна диагностическая строка.
labels разрешён для элементов, но не для атрибутов.
Ожидаемый результат
Обе маски и их способы обработки прочитаны на конкретном контракте.
На что обратить внимание
Допускает не проверяет тип или содержимое конкретного XML-элемента.
skip не разрешает DTD, внешние сущности или загрузку URL автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.