DynamicContent
Представление контента документа. Не имеет фиксированного набора полей. Разные документы имеют разные свойства.
Свойства
Набор свойств вычисляется во время работы программы на основании UserDataXSD. Скачать файл UserDataXSD можно методами Box.SaveTitleDynamicContentXSD(), Box.GetBase64TitleDynamicContentXSD().
Принцип построения DynamicContent по UserDataXSD описан ниже.
Также набор полей и методов можно узнать, используя объект Reflector.
Представление контента документа имеет рекурсивную структуру:
полями DynamicContent могут являться:
строки,
объекты интерфейса IValueCollection,
объекты DynamicContent.
объекты IValueCollection могут содержать:
строки,
объекты DynamicContent.
Краткий алгоритм формирования DynamicContent
Описание объекта можно получить двумя способами. Вы можете использовать Reflector или следующий алгоритм:
Скачайте файл UserDataXSD с помощью методов
Box.SaveTitleDynamicContentXSD(),Box.GetBase64TitleDynamicContentXSD().DynamicContent по этой схеме построит набор полей.
Вы можете обращаться к ним, как к обычным свойствам.
Если в схеме коллекция — у объекта будет метод
Add...(), чтобы добавлять новые элементы.
Методы
Не имеет фиксированного набора методов. Наличие методов, их имена и интерфейс определяется наличием коллекций значений в текущем экземпляре объекта.
Общие правила: как XSD превращается в DynamicContent
Имена полей
Имя поля в DynamicContent совпадает с именем элемента в XSD.
Если у элемента в XSD нет имени и он повторяется, в DynamicContent поле с коллекцией будет называться items.
Пример XSD:
<xs:choice maxOccurs="unbounded">
<xs:element name="string_field_1" type="xs:string"/>
<xs:element name="string_field_2" type="xs:string"/>
</xs:choice>
maxOccurs="unbounded" означает, что элемент может повторяться неограниченно.
Контейнер xs:choice не имеет имени, поэтому в DynamicContent коллекция элементов будет лежать в поле items.
Каждый элемент items содержит поля: string_field_1 или string_field_2.
Для каждого элемента items должно быть заполнено только одно из этих полей.
Простые элементы
Элементы простого типа становятся строковыми свойствами в DynamicContent.
Популярные элементы простого типа:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
Пример XSD:
<xs:attribute name="Number" type="xs:string"/>
...
<xs:attribute name="Price" type="xs:decimal"/>
В DynamicContent будут поля с именами Number и Price строкового типа.
Сложные элементы
Если в схеме есть complexType — элемент с вложенными полями, он превращается в DynamicContent.
Пример XSD:
<xs:element name="Seller"> <xs:complexType>....
В DynamicContent появится свойство Seller — объект DynamicContent.
SimpleContent
Если элемент в XSD описан как xs:simpleContent , т.е. у него есть значение + атрибуты, в DynamicContent добавляется поле с именем SimpleContentValue.
Пример XSD:
<xs:complexType name="Position">
<xs:simpleContent>
<xs:extension base="string255z">
<xs:attribute name="PositionSource" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Employee"/>
<xs:enumeration value="Certificate"/>
<xs:enumeration value="StorageByTitleTypeId"/>
<xs:enumeration value="Manual"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
В DynamicContent для типа Position будет 2 поля:
SimpleContentValue — строка длиной 0-255 символов.
PositionSource — строка для указания одного из значений [«Employee», «Certificate», «StorageByTitleTypeId», «Manual»].
Наследование типов
Если тип в XSD наследуется от другого, то в DynamicContent он получит все свойства родителя.
Пример XSD:
<xs:complexType name="ParentType">
<xs:sequence>
<xs:element name="Number" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ChildType">
<xs:complexContent>
<xs:extension base="ParentType">
<xs:sequence>
<xs:element name="Date" type="xs:date"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Отображение в DynamicContent:
Тип в XSD |
Поля в DynamicContent |
|---|---|
ParentType |
Number |
ChildType |
Number — унаследовано Date — добавлено |
Повторяющиеся элементы
Если элемент встречается несколько раз maxOccurs= "unbounded", maxOccurs > 1, он превращается в коллекцию IValueCollection.
Также в объект будет добавлен метод для добавления элемента в коллекцию по правилам:
Имя метода для добавления элемента —
"Add" + <Имя поля с коллекцией>.Если коллекция хранит в себе повторяющиеся строки, а не DynamicContent, то метод нужно вызвать с одним параметром — добавляемой в коллекцию строкой. Возвращаемого значения у метода не будет.
Если коллекция хранит не строки, то метод нужно вызвать без параметров. Метод вернёт добавленный в коллекцию элемент.
Примеры XSD:
<xs:element name="Repeatable" type="ComplexType" maxOccurs="unbounded"/>
В DynamicContent появится коллекция объектов Repeatable для типа ComplexType
и метод DynamicContent.AddRepeatable(), возвращающий Repeatable для нового элемента этой коллекции.
<xs:element name="Repeatable" type="string50" maxOccurs=20>
В DynamicContent появится коллекция строк Repeatable и метод DynamicContent.AddRepeatable(SomeNewString), добавляющий элемент в коллекцию без возвращаемого значения.