Имя: Пароль:
1C
1С v8
пакет xsd - задать ограничение "либо тот элемент, либо этот"
0 PiotrLoginov
 
23.06.22
14:14
Всем здрасте. По идее, обернув в схеме xsd некоторые дочерние элементы в <xs:choice>, мы жестко ограничиваем количество вложенных элементов (только один из перечисленных) к родительском элементе.


Мне надо, что бы в узел "Описание" можно было вложить либо "Свойство1", либо "Свойство2". Но никак не оба сразу.

Вот схема:
<xs:schema xmlns:tns="http://localhost/test01" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost/test01" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:element name="КорневоеСвойство" type="tns:КорневоеСвойство"/>
    <xs:complexType name="Карточка">
        <xs:sequence>
            <xs:element name="Описание" type="tns:Описание"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="КорневоеСвойство">
        <xs:sequence>
            <xs:element name="Карточки" type="tns:Карточка" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Описание">
        <xs:choice>
            <xs:element name="Свойство1" type="tns:Свойство1" minOccurs="0"/>
            <xs:element name="Свойство2" type="tns:Свойство2" minOccurs="0"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="Свойство1">
        <xs:attribute name="АтрибутСвойства1" type="xs:string" use="required"/>
    </xs:complexType>
    <xs:complexType name="Свойство2">
        <xs:sequence>
            <xs:element name="ЭлементСвойства2" minOccurs="0">
                <xs:complexType>
                    <xs:attribute name="ЗначениеЭлемента" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>




Тестирую:
    ПакетCML = ФабрикаXDTO.Пакеты.Получить("http://localhost/test01");
    ТипКорневоеСвойствоXDTO = ПакетCML.Получить("КорневоеСвойство");
    ТипКарточкаXDTO = ПакетCML.Получить("Карточка");
    ТипОписаниеXDTO = ПакетCML.Получить("Описание");
    
    ТипСвойство1XDTO = ПакетCML.Получить("Свойство1");
    
    ТипСвойство2XDTO = ПакетCML.Получить("Свойство2");
    ТипЭлементСвойства2XDTO = ТипСвойство2XDTO.Свойства.Получить("ЭлементСвойства2").Тип;
    
    
    
    Свойство1XDTO = ФабрикаXDTO.Создать(ТипСвойство1XDTO);
    Свойство1XDTO.АтрибутСвойства1 = "Значение атрибута в свойстве1";
    
    ЭлементСвойства2XDTO = ФабрикаXDTO.Создать(ТипЭлементСвойства2XDTO);
    ЭлементСвойства2XDTO.ЗначениеЭлемента = "Значение атрибута в элементе свойства2";
    Свойство2XDTO = ФабрикаXDTO.Создать(ТипСвойство2XDTO);
    Свойство2XDTO.ЭлементСвойства2 = ЭлементСвойства2XDTO;
    
    
    
    ОписаниеXDTO = ФабрикаXDTO.Создать(ТипОписаниеXDTO);
    ОписаниеXDTO.Свойство1 = Свойство1XDTO;
    ОписаниеXDTO.Свойство2 = Свойство2XDTO;  // вот это вот, по идее, должно привести к ошибке
    
    КарточкаXDTO = ФабрикаXDTO.Создать(ТипКарточкаXDTO);
    КарточкаXDTO.Описание = ОписаниеXDTO;
    
    КорневоеСвойствоXDTO = ФабрикаXDTO.Создать(ТипКорневоеСвойствоXDTO);
    КорневоеСвойствоXDTO.Карточки.Добавить(КарточкаXDTO);
    
    КорневоеСвойствоXDTO.Проверить();
    
    
    ИмяВременногоФайла = "C:\FILES\РАБОТА\Астрал\Задачи\МЧД\К предложению Такском\test.xml";
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневоеСвойствоXDTO, "КорневоеСвойство");
    ЗаписьXML.Закрыть();


И что б вы думали? Код отрабатывает без проблем, создается файл, в котором "Описание" имеет одновременно и "Свойство1", и "Свойство2":

<?xml version="1.0" encoding="UTF-8"?>
<КорневоеСвойство xmlns="http://localhost/test01" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Карточки>
        <Описание>
            <Свойство1 АтрибутСвойства1="Значение атрибута в свойстве1"/>
            <Свойство2>
                <ЭлементСвойства2 ЗначениеЭлемента="Значение атрибута в элементе свойства2"/>
            </Свойство2>
        </Описание>
    </Карточки>
</КорневоеСвойство>




Как правильно описать схему, чтобы невозможно было помещать в <Описание> сразу оба дочерних свойства, а только одно какое-то?
1 dmt
 
23.06.22
14:23
А если так попробовать:
<xs:choice maxOccurs=1>
2 PiotrLoginov
 
23.06.22
18:58
(1) попробовал. Схему стало невозможно импортировать в xdto-пакет - ошибка разбора XML.

Но спасибо за идею.