Я пытаюсь создать инструмент, который может генерировать XSD для XAML, созданного путем сериализации типа в .NET, но это не относится конкретно к .NET.
Допустим, у меня есть тип. Этот тип имеет свойства и является коллекцией.
public class MyType : Collection<CollectedType>
{
public PType1 PropertyOne {get;set;}
public PType2 PropertyTwo {get;set;}
}
Сериализуется следующим образом (без построения графа объекта):
<MyType xmlns="clr-namespace:blahblahblah">
<CollectedType name="First instance in the collection"/>
<CollectedType name="Second instance in the collection"/>
<MyType.PropertyOne>
<PType1 Value = "Serialized object in PropertyOne" />
</MyType.PropertyOne>
<MyType.PropertyTwo>
<PType2 Value = "Serialized object in PropertyTwo" />
</MyType. PropertyTwo >
</MyType>
При создании XSD для этого типа я могу сказать следующее:
- MyType - это сложный тип
- MyType будет содержать ссылку на группу с именем CollectedTypeGroup
- CollectedTypeGroup содержит элемент CollectedType и элементы для типов, расширяющих CollectedType
- MyType будет содержать элемент с именем MyType.PropertyOne
- PType1 - другой сложный тип
- MyType будет содержать элемент с именем MyType.PropertyTwo
- PType2 - это еще один сложный тип
Это все относительно легко сделать. Вот кусок сгенерированного xsd:
<xs:complexType name="MyType">
<xs:sequence>
<xs:element name="MyType.PropertyOne" type="PType1"/>
<xs:element name="MyType.PropertyOne" type="PType1"/>
<xs:group ref="CollectedTypeGroup"/>
</xs:sequence>
</xs:complexType>
Теперь самое сложное. Поскольку XML будет преобразован обратно в граф объектов, у меня есть список ограничений на то, как элементы добавляются в MyType, которые ДОЛЖНЫ БЫТЬ , предписанные схемой. Если эти три требования и только эти три не соблюдаются, у меня возникают проблемы с пользователями, пытающимися использовать мою схему:
1) Элементы, добавленные в MyType , не должны ограничиваться конкретным заказом
2) Элементы, представляющие свойство моего объекта, могут появляться только один раз или не появляться вообще
3) элементы группы должны быть неограниченными ; они могут появляться где угодно в родительском элементе и 0 ... * times
Здесь я ужасно провожу время. Я не могу найти удовлетворительного сочетания вариантов, последовательностей, всего и т. Д., Чтобы удовлетворить эти три требования. Я также попытался поместить элементы в отдельную группу, complexTypes и т. Д. Кажется, ничего не работает.
Как я могу объединить свои элементы и группы в один комплексный тип и соответствовать моим трем требованиям?