Тип: ЭлементDOM. Элемент DOM, который соответствует данному компоненту схемы XML. Синхронизация значений свойств компонента схемы XML и структуры элемента DOM обеспечивается вызовом метода ДокументацияXS.ОбновитьЭлементDOM. Перед первым вызовом данного метода значение данного свойства может быть Неопределено.
Полное описание, параметры и ограничения
ДокументацияXS.ЭлементDOM (XSDocumentation.DOMElement)
ДокументацияXS (XSDocumentation)
ЭлементDOM (DOMElement)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: ЭлементDOM.
Элемент DOM, который соответствует данному компоненту схемы XML.
Синхронизация значений свойств компонента схемы XML и структуры элемента DOM обеспечивается вызовом метода ДокументацияXS.ОбновитьЭлементDOM.
Перед первым вызовом данного метода значение данного свойства может быть Неопределено.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Обойти дерево компонентов собственной схемы и связать его с XML DOM
У схемы, типа, фасета, объявления и аннотации есть общие связи. Обходим конкретный контракт товара с защитой от циклов и показываем владельца компонента, не передаём неизвестную схему.
Где и как запускать
В учебной базе создайте серверный общий модуль УчебныеЗадачи. Вставьте приведённые функции и процедуру целиком в модуль, не внутрь другой процедуры. Вызовите УчебныеЗадачи.ВыполнитьПример() из серверного обработчика команды учебной обработки. Каждый урок запускайте отдельно, без дублирования одноимённых процедур.
Подготовка
Вставьте обе процедуры полностью на уровне серверного общего модуля. ВыполнитьПример создаёт XSD из собственной короткой строки.
Не подменяйте XSD внешней схемой: ограничение 200 компонентов и глубины 20 рассчитано на этот учебный контракт.
Контракт содержит аннотацию/документацию, простой тип с двумя фасетами, составной тип, последовательность элементов и обязательный атрибут.
Процедура ВыполнитьПример() Экспорт
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:product"" targetNamespace=""urn:guide:product""
| elementFormDefault=""qualified"" version=""1.0"" xml:lang=""ru"">
| <xs:annotation><xs:documentation>Учебный товар, не контракт внешнего API</xs:documentation></xs:annotation>
| <xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
| <xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/>
| </xs:restriction></xs:simpleType>
| <xs:complexType name=""Product""><xs:sequence>
| <xs:element name=""name"" type=""xs:string""/>
| <xs:element name=""quantity"" type=""xs:nonNegativeInteger""/>
| <xs:element name=""note"" type=""xs:string"" minOccurs=""0""/>
| </xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/>
| </xs:complexType>
| <xs:element name=""product"" type=""g:Product""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
Просмотренные = Новый Массив;
Виды = Новый Соответствие;
ПоказатьКомпонентСхемы(Схема, 0, Просмотренные, Виды);
Сообщить("Просмотрено компонентов: " + Строка(Просмотренные.Количество()));
Для Каждого Вид Из Виды Цикл
Сообщить(Вид.Ключ + ": " + Строка(Вид.Значение));
КонецЦикла;
Сообщить(Просмотренные.Количество() > 10);
КонецПроцедуры
Процедура ПоказатьКомпонентСхемы(Компонент, Глубина, Просмотренные, Виды)
Если Глубина > 20 Или Просмотренные.Количество() >= 200 Тогда
ВызватьИсключение "Превышен размер собственного учебного дерева схемы";
КонецЕсли;
Если Просмотренные.Найти(Компонент) <> Неопределено Тогда
Возврат;
КонецЕсли;
Просмотренные.Добавить(Компонент);
ИмяВида = Строка(ТипЗнч(Компонент));
КоличествоВида = Виды.Получить(ИмяВида);
Если КоличествоВида = Неопределено Тогда
КоличествоВида = 0;
КонецЕсли;
Виды.Вставить(ИмяВида, КоличествоВида + 1);
Сообщить(СтрШаблон("Глубина %1: %2; тип компоненты %3", Глубина, ИмяВида, Компонент.ТипКомпоненты));
Если Компонент.Контейнер <> Неопределено Тогда
Сообщить("Контейнер: " + Строка(ТипЗнч(Компонент.Контейнер)));
КонецЕсли;
Если Компонент.КорневойКонтейнер <> Неопределено Тогда
Сообщить("Корневой контейнер: " + Строка(ТипЗнч(Компонент.КорневойКонтейнер)));
КонецЕсли;
Если Компонент.Схема <> Неопределено Тогда
Сообщить("Схема: " + Компонент.Схема.ПространствоИмен);
КонецЕсли;
Если Компонент.Аннотация <> Неопределено Тогда
Сообщить("Есть отдельная аннотация компонента");
КонецЕсли;
// Синхронизируем только своё дерево в памяти, не конфигурацию и не файл.
Компонент.ОбновитьЭлементDOM();
Если Компонент.ЭлементDOM <> Неопределено Тогда
Сообщить("Тег DOM: " + Компонент.ЭлементDOM.ИмяЭлемента);
КонецЕсли;
Дочерние = Компонент.Компоненты;
Для Каждого Дочерний Из Дочерние Цикл
ПоказатьКомпонентСхемы(Дочерний, Глубина + 1, Просмотренные, Виды);
КонецЦикла;
КонецПроцедурыРазбор по шагам
Построитель создаёт конкретное дерево компонентов из нашей XSD. Начальная точка обхода — сама СхемаXML.
Компоненты возвращает только компоненты, которыми владеет текущий компонент. Цикл рекурсивно проходит структуру типов, объявлений и ограничений.
Контейнер и КорневойКонтейнер описывают связи владения. Схема связывает компонент с описанием пространства имён, а Аннотация с пояснением.
Массив Просмотренные предотвращает повторный обход одной ссылки; два ограничителя защищают учебный обработчик от неожиданно большой структуры.
ОбновитьЭлементDOM синхронизирует описание компонента с его XML DOM. ЭлементDOM после синхронизации показывает соответствующий тег.
Итоговая карта Виды показывает реальные классы дерева, а не число товаров. Все изменения происходят только в собственной схеме в памяти.
Как проверить результат
Появляются компоненты схемы, типов Sku/Product, объявлений, фасетов length/pattern и аннотации с документацией.
Теги DOM соответствуют видам: schema, simpleType, complexType, length, pattern, element и другие части данного контракта.
Просмотрено больше десяти компонентов и меньше ограничителя 200; ошибки глубины не возникает на исходной XSD.
Модули конфигурации, справочники и файлы после обхода не изменяются.
Ожидаемый результат
Построена читаемая карта структуры собственной схемы с её владельцами и DOM-представлением.
На что обратить внимание
Компоненты схемы и ДочерниеУзлы XML DOM — разные коллекции с разной моделью владения.
Нельзя переносить этот обход на произвольные внешние схемы без отдельной проверки размера и импортов.
ОбновитьЭлементDOM синхронизирует представление, но не выполняет публикацию, обновление конфигурации или запись товара.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Собрать новое объявление из собственных компонентов
Создаём нотацию, аннотацию, документацию и appinfo конструкторами. Присоединяем их к собственной схеме и проверяем владельцев.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Каждый фрагмент выполните отдельно на сервере учебной базы. Полная собственная XSD с urn:guide:product и нотацией BookImage включена в код.
Это xs:notation внутри XSD, не узел НотацияDOM из DTD. В коде нет DOCTYPE, внешних сущностей, импорта схемы, чтения файла или сетевого запроса.
public и system — вымышленные собственные URN. Объявление метки не загружает изображение и не подтверждает существование файла.
Проверить у НаборСхемXML проверяет схему, не XML-экземпляр товара. Изменения относятся только к собственной модели в памяти.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:product"" targetNamespace=""urn:guide:product""
| elementFormDefault=""qualified"" version=""1.0"" xml:lang=""ru"">
| <xs:annotation><xs:documentation>Учебный товар, не контракт внешнего API</xs:documentation></xs:annotation>
| <xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
| <xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/>
| </xs:restriction></xs:simpleType>
| <xs:complexType name=""Product""><xs:sequence>
| <xs:element name=""name"" type=""xs:string""/>
| <xs:element name=""quantity"" type=""xs:nonNegativeInteger""/>
| <xs:element name=""note"" type=""xs:string"" minOccurs=""0""/>
| </xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/>
| </xs:complexType>
| <xs:element name=""product"" type=""g:Product""/>
| <xs:notation name=""BookImage"" public=""urn:guide:book-image:public"" system=""urn:guide:book-image:system"">
| <xs:annotation><xs:documentation source=""urn:guide:notation-note"" xml:lang=""ru"">Учебная метка изображения, не загрузка картинки</xs:documentation></xs:annotation>
| </xs:notation>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
Если Схема.ОбъявленияНотаций.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна собственная нотация";
КонецЕсли;
Нотация = Схема.ОбъявленияНотаций.Получить(0);
Если ТипЗнч(Нотация) <> Тип("ОбъявлениеНотацииXS") Или Нотация.Имя <> "BookImage" Тогда
ВызватьИсключение "Не найдена собственная BookImage";
КонецЕсли;
Аннотация = Нотация.Аннотация;
Если Аннотация = Неопределено Тогда
ВызватьИсключение "У BookImage нет собственной аннотации";
КонецЕсли;
Если Аннотация.Документация.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна собственная документация нотации";
КонецЕсли;
Документация = Аннотация.Документация.Получить(0);
НоваяНотация = Новый ОбъявлениеНотацииXS;
НоваяНотация.Имя = "BookImageExtra";
НоваяНотация.ПубличныйИдентификатор = "urn:guide:book-image:extra:public";
НоваяНотация.СистемныйИдентификатор = "urn:guide:book-image:extra:system";
НоваяАннотация = Новый АннотацияXS;
НоваяДокументация = Новый ДокументацияXS;
НоваяДокументация.Источник = "urn:guide:notation-note:extra";
НоваяДокументация.Язык = "ru";
НоваяИнформация = Новый ИнформацияДляПриложенияXS;
НоваяИнформация.Источник = "urn:guide:application-note:extra";
НоваяАннотация.Состав.Добавить(НоваяДокументация);
НоваяАннотация.Состав.Добавить(НоваяИнформация);
НоваяНотация.Аннотация = НоваяАннотация;
Схема.Содержимое.Добавить(НоваяНотация);
Схема.ОбновитьЭлементDOM();
Сообщить(Схема.ОбъявленияНотаций.Количество() = 2);
Сообщить(НоваяАннотация.Документация.Количество() = 1);
Сообщить(НоваяАннотация.ИнформацияДляПриложения.Количество() = 1);
Сообщить(НоваяДокументация.Контейнер = НоваяАннотация);
Сообщить(НоваяИнформация.Контейнер = НоваяАннотация);
Сообщить(НоваяНотация.Содержит(НоваяАннотация));
Сообщить(НоваяАннотация.Содержит(НоваяДокументация));
Сообщить(НоваяДокументация.ЭлементDOM.ПолучитьАтрибут("source") = "urn:guide:notation-note:extra");
Сообщить(НоваяИнформация.ЭлементDOM.ПолучитьАтрибут("source") = "urn:guide:application-note:extra");
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Собственная схема с новыми компонентами не прошла проверку";
КонецЕсли;
Схема.Содержимое.Удалить(НоваяНотация);
Сообщить(Схема.ОбъявленияНотаций.Количество() = 1);
Сообщить(Нотация.Имя = "BookImage");Разбор по шагам
Четыре конструктора создают отдельные объекты: до присоединения они не являются частью схемы.
Документация и appinfo добавляются в изменяемый Состав аннотации. Два readonly-списка отражают соответствующие виды компонентов.
Аннотация назначается новому объявлению, затем объявление добавляется в собственное Содержимое схемы.
Обновление DOM выполняется после построения связей. source — метка происхождения, не запрос по адресу.
Проверяем владельцев и принадлежность, затем удаляем только новую нотацию вместе с её собственным поддеревом.
Новые documentation/appinfo здесь содержат метки источников, без текста правил валидации; исходная документация BookImage сохраняется.
Как проверить результат
Одиннадцать сообщений Истина; глобальные нотации 1→2→1.
У новой аннотации по одному documentation и appinfo. После удаления нового поддерева остаётся исходная BookImage.
Ожидаемый результат
Конструкторы показаны в полном цикле сборки, присоединения и безопасного удаления своих компонентов.
На что обратить внимание
Не используйте НоваяНотация и её дочерние объекты после удаления из схемы.
Аннотация и служебные source не заменяют ограничения типов или проверку XML-экземпляра.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.