![]() |
![]() |
|
пакет 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.
Но спасибо за идею. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |