DynamicContent

Представление контента документа

Свойства

Набор свойств вычисляется в runtime на основе UserDataXSD. Скачать файл UserDataXSD можно методами Box.SaveTitleDynamicContentXSD(), Box.GetBase64TitleDynamicContentXSD().

Принцип построения DynamicContent’а по UserDataXSD описан ниже.

Также набор полей и методов узнать, используя объект Reflector

Представление контента документа имеет рекурсивную структуру:

Методы

Не имеет фиксированного набора методов. Наличие методов, их имена и интерфейс определяется наличием коллекций значений в текущем экземпляре объекта.

Общие правила формирования структуры DynamicContent’а

  • Элементы сложного типа будут представлены как DynamicContent

    • <xs:element name="ComplexElementName"> <xs:complexType>....

    • <xs:element name="ComplexElementName" type="ComlexElementType">

  • Элементы встроенного типа и унаследованные от них будут представлены как строки

    • <xs:attribute name="SimpleElementName" type="string50"> ( <xs:simpleType name="string50"> <xs:restriction base="xs:string"> )

    • <xs:attribute name="SimpleElementName"><xs:simpleType><xs:restriction base="xs:decimal">...

  • Повторяющиеся элементы (maxOccurs= "unbounded", maxOccurs > 1 или повторяющиеся по умолчанию для описанного типа элемента) будут добавлены как IValueCollection

  • Имя поля в DynamicContent, соответствующего элементу XSD будет совпадать с именем элемента в XSD

  • Если у повторяющегося элемента XSD не указано имя, то будет применено имя items

  • Если тип элемента наследуется от другого типа, то наследник будет иметь все свойства родителя

    • <xs:complexType name="ChildType"><xs:extension base="ParentType">...

  • Для заполнения/чтения значения в xs:simpleContent в DynamicContent добавляется поле с именем SimpleContentValue

Как работать с коллекциями

  1. Чтобы добавить элемент в коллекцию, необходимо вызвать метод объекта, в котором эта коллекция лежит. Назовём этот объект ВладелецКоллекции

  2. Имя метода для добавления элемента - "Add" + <Имя поля с коллекцией>

  3. Если коллекция хранит в себе повторяющиеся строки (а не DynamicContent), то метод нужно вызвать с одним параметром - добавляемой в коллекцию строкой. Возвращаемого значения у метода не будет

  4. Если коллекция хранит не строки, то метод нужно вызвать без параметров. Метод вернёт добавленный в коллекцию элемент

Пример работы с динамическим контентом

// Добавление нового элемента в коллекцию строк
SendTask = Organization.CreatePackageSendTask2();
DocumentToSend = SendTask.AddDocument("UniversalTransferDocument", "СЧФДОП", "utd820_05_01_01");
DynamicContent = DocumentToSend.Content;
Utd820_SellerContent = DynamicContent.UniversalTransferDocument;

Signers = Utd820_SellerContent.Signers;
NewSigner = Signers.AddItems();
// Signers - Владелец коллекции с именем items. Имя будет items потому, что у узла choice нет имени и он повторяющийся
// Описание в XSD:
// <xs:element name="Signers">
//   <xs:complexType>
//     <xs:choice maxOccurs="unbounded">
//       <xs:element name="SignerReference" type="SignerReference" />
//       <xs:element name="SignerDetails" type="ExtendedSignerDetails_SellerTitle" />
//     </xs:choice>
//   </xs:complexType>
// </xs:element>

InvoiceTable = Utd820_SellerContent.Table;
NewInvoiceTableItem = InvoiceTable.AddItem();
// InvoiceTable - Владелец коллекции с именем Item
// Описание в XSD:
// <xs:complexType name="InvoiceTable">
// <xs:sequence>
//   <xs:element maxOccurs="unbounded" name="Item">

ItemIdentificationNumbers = NewInvoiceTableItem.ItemIdentificationNumbers;
NewItemIdentificationNumber = ItemIdentificationNumbers.AddItemIdentificationNumber();
NewItemIdentificationNumber.AddUnit("Unit1")
NewItemIdentificationNumber.TransPackageId = "SomeTransPackageId";
// ItemIdentificationNumbers - Владелец коллекции с именем ItemIdentificationNumber
// NewItemIdentificationNumber - владелец коллекции строк с именем Unit. В отличие от Signers, узел choice не повторяющийся
// Описание в XSD:
// <xs:element minOccurs="0" name="ItemIdentificationNumbers">
//   <xs:complexType>
//     <xs:sequence>
//       <xs:element maxOccurs="**unbounded**" name="ItemIdentificationNumber">
//         <xs:complexType>
//           <xs:choice>
//             <xs:element minOccurs="0" maxOccurs="unbounded" name="Unit" type="string255">
//             </xs:element>
//             <xs:element minOccurs="0" maxOccurs="unbounded" name="PackageId" type="string255">
//             </xs:element>
//           </xs:choice>
//           <xs:attribute name="TransPackageId" type="string255" use="optional">
//           </xs:attribute>
//         </xs:complexType>
//       </xs:element>
//     </xs:sequence>
//   </xs:complexType>
// </xs:element>