МаскаXS.ЭлементDOM

Свойства · DOMElement

Тип: ЭлементDOM. Элемент DOM, который соответствует данному компоненту схемы XML. Синхронизация значений свойств компонента схемы XML и структуры элемента DOM обеспечивается вызовом метода МаскаXS.ОбновитьЭлементDOM. Перед первым вызовом данного метода значение данного свойства может быть Неопределено.

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

МаскаXS.ЭлементDOM (XSWildcard.DOMElement)

МаскаXS (XSWildcard)

ЭлементDOM (DOMElement)

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

Использование:
Только чтение.
Описание:
Тип: ЭлементDOM.
Элемент DOM, который соответствует данному компоненту схемы XML.
Синхронизация значений свойств компонента схемы XML и структуры элемента DOM обеспечивается вызовом метода МаскаXS.ОбновитьЭлементDOM.
Перед первым вызовом данного метода значение данного свойства может быть Неопределено.
Доступность:

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

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

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

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

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

Изменить копию маски, не расширяя оригинальный контракт

Маска принадлежит модели Envelope. Копии задаём другой список URI, оригинал продолжает разрешать только 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") Тогда
    ВызватьИсключение "Не получены собственные маски элементов и атрибутов";
КонецЕсли;
Сообщить(МаскаЭлементов.Контейнер <> Неопределено);
Сообщить(МаскаЭлементов.КорневойКонтейнер <> Неопределено);
Сообщить(МаскаЭлементов.Схема.ПространствоИмен = "urn:guide:envelope");
Сообщить(МаскаЭлементов.Аннотация = Неопределено);
Сообщить("Тип компонента: " + Строка(МаскаЭлементов.ТипКомпоненты));
Сообщить("Компонентов маски: " + Строка(МаскаЭлементов.Компоненты.Количество()));
МаскаЭлементов.ОбновитьЭлементDOM();
Сообщить(МаскаЭлементов.ЭлементDOM.ПолучитьАтрибут("processContents") = "lax");
Копия = МаскаЭлементов.КлонироватьКомпоненту(Истина);
Если ТипЗнч(Копия) <> Тип("МаскаXS") Тогда
    ВызватьИсключение "Не получена независимая копия маски";
КонецЕсли;
Копия.ЛексическоеЗначениеОграниченияПространствИмен = "urn:guide:unknown";
Копия.ВидОбработкиСодержимого = ОбработкаСодержимогоXS.Пропустить;
Сообщить(Копия.Допускает("urn:guide:unknown"));
Сообщить(Не МаскаЭлементов.Допускает("urn:guide:unknown"));
Сообщить(МаскаЭлементов.Допускает("urn:guide:partner"));
Сообщить(Не МаскаЭлементов.Содержит(Копия));

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

  1. Контейнер и Схема связывают оригинальную маску с собственным деревом.

  2. ОбновитьЭлементDOM обновляет DOM оригинала и позволяет прочитать processContents=lax.

  3. Рекурсивная копия проверена по типу, перед изменением её лексического списка URI.

  4. Копия разрешает unknown, но не добавлена в исходную модель. Оригинал его по-прежнему не разрешает.

  5. Содержит не подтверждает принадлежность клона; сам факт клонирования не расширяет исходный контракт.

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

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

  2. Оригинальная маска не разрешает unknown после изменения копии.

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

Проверено независимое изменение разрешённых пространств имён.

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

  1. Изменение отсоединённой копии не изменяет действующую XSD.

  2. В рабочих интеграциях расширение маски требует отдельного решения о допустимых данных.

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

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

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

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

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