Кодирование таблиц данных в формате XML

В этом приложении описывается, как Таблицы данных кодируются в (и декодируются из) XML. Таблицы данных кодируются в XML только, когда их необходимо передать как строковые аргументы для функций Web-сервиса, во всех других случаях SberMobile использует свой собственный синтаксис кодирования.

В большинстве остальных компонентов SberMobile (базе данных, Протоколе взаимодействия SberMobile и пр.) таблицы данных хранятся и передаются при помощи так называемого собственного кодирования. Этот формат описан в отдельном приложении.

XML - схема для таблиц данных

Следующая XML-схема используется для кодирования таблиц данных:

XML-схема - это описание типа XML-документа, обычно выраженного в виде ограничений на структуру и содержание документов такого типа. XML-схема предоставляет документ на высоком уровне абстракции.

Дополнительную информацию см. на сайте: http://www.w3.org/XML/Schema

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="table">

       <xs:complexType>

               <xs:sequence>

                       <xs:element ref="format" minOccurs="0" maxOccurs="1"/>

                       <xs:element ref="records" minOccurs="0" maxOccurs="1"/>

               </xs:sequence>

       </xs:complexType>

</xs:element>

<xs:element name="format">

       <xs:complexType>

               <xs:sequence>

                       <xs:element ref="fields" minOccurs="0"/>

               </xs:sequence>

               <xs:attribute name="maxRecords" type="xs:integer"/>

               <xs:attribute name="minRecords" type="xs:integer"/>

       </xs:complexType>

</xs:element>

<xs:element name="fields">

       <xs:complexType>

               <xs:sequence>

                       <xs:element ref="field" maxOccurs="unbounded"/>

               </xs:sequence>

       </xs:complexType>

</xs:element>

<xs:element name="field">

       <xs:complexType>

               <xs:sequence>

                       <xs:element ref="selectionValues" minOccurs="0"/>

                       <xs:element ref="defaultValue" minOccurs="0"/>

               </xs:sequence>

               <xs:attribute name="description"/>

               <xs:attribute name="name" type="xs:NCName" use="required"/>

               <xs:attribute name="notReplicated" type="xs:boolean"/>

               <xs:attribute name="nullable" type="xs:boolean"/>

               <xs:attribute name="readonly" type="xs:boolean"/>

               <xs:attribute name="type" type="fieldType" use="required"/>

       </xs:complexType>

</xs:element>

<xs:element name="selectionValues">

       <xs:complexType>

               <xs:sequence>

                       <xs:element ref="option" maxOccurs="unbounded"/>

               </xs:sequence>

       </xs:complexType>

</xs:element>

<xs:element name="option">

       <xs:complexType mixed="true">

               <xs:complexContent>

                       <xs:extension base="fieldVal">

                               <xs:attribute name="description" use="required"/>

                       </xs:extension>

               </xs:complexContent>

       </xs:complexType>

</xs:element>

<xs:element name="defaultValue" type="fieldVal"/>

<xs:element name="records">

       <xs:complexType>

               <xs:sequence>

                       <xs:element ref="record" maxOccurs="unbounded"/>

               </xs:sequence>

       </xs:complexType>

</xs:element>

<xs:element name="record">

       <xs:complexType>

               <xs:sequence>

                       <xs:element name="value" maxOccurs="unbounded" minOccurs="0">

                           <xs:complexType mixed="true">

                               <xs:complexContent>

                                               <xs:extension base="fieldVal">

                                                       <xs:attribute name="name" use="required"/>

                                               </xs:extension>

                                       </xs:complexContent>

                           </xs:complexType>

                       </xs:element>

               </xs:sequence>

       </xs:complexType>

</xs:element>

<xs:simpleType name="fieldType">

       <xs:restriction base="xs:string">

               <xs:enumeration value="A"/>

               <xs:enumeration value="I"/>

               <xs:enumeration value="D"/>

               <xs:enumeration value="T"/>

               <xs:enumeration value="S"/>

               <xs:enumeration value="B"/>

               <xs:enumeration value="L"/>

               <xs:enumeration value="F"/>

               <xs:enumeration value="O"/>

               <xs:enumeration value="C"/>

       </xs:restriction>

</xs:simpleType>

<xs:complexType name="fieldVal" mixed="true">

       <xs:choice minOccurs="0">

               <xs:element ref="data"/>

               <xs:element ref="table"/>

       </xs:choice>

</xs:complexType>

<xs:element name="data">

       <xs:complexType>

               <xs:attribute name="name" type="xs:string"/>

               <xs:attribute name="contentType" type="xs:string"/>

       </xs:complexType>

</xs:element>

</xs:schema>

Эта XML-схема определяет структуру XML-документа таблицы данных. Корневой элемент - table определяет Таблицу данных.

Элемент table может содержать один элемент format , который описывает формат таблиц данных. Он может также содержать опциональный элемент records , который включает список записей таблиц с данными.

Элемент format должен включать подэлемент fields , содержащий список полей таблицы. Он может иметь атрибуты minRecords и maxRecords , которые определяют минимальное и максимальное количество записей в таблице. Если minRecords не определён, минимальное количество записей равно нулю. Если maxRecords не определено, максимальное количество записей не ограничено (на практике ограничено 2^64).

Элемент fields состоит из одного или более элементов field. Элемент field определяет формат одного поля. Для него требуются атрибуты name и type. Элемент fieldType может быть представлен одним кодом типа, определённого здесь. Атрибуты description, notReplicated, nullable и readonly опциональны. Элемент field может быть также включать подэлементы selectionValues и defaultValue. Дополнительную информацию об этих атрибутах и элементах можно найти в разделе Таблицы данных.

Элемент selectionValues может содержать один или более элементов option. Элемент value относится к типу fieldVal. Элемент value требует атрибут description , который определяет описание определённого значения выбора.

defaultValue тоже относится к типу fieldVal.

Элементы типа fieldVal используются для хранения значений данных ячеек таблиц, значений выбора и значений по умолчанию. Элементы данного типа могут быть представлены:

  • элементами table (включённые таблицы)
  • элементами data (бинарные блоки данных)
  • простым текстом (все типы значений, см правила кодирования здесь)

Элементы records содержат последовательность элементов записи. Каждая запись представляет одну запись Таблицы данных. Она содержит количество элементов value. Их тип данных - fieldVal, описан ранее. У каждого элемента есть необходимый атрибут name, включая имя поля, чьё значение представляет value.

Примеры таблицы данных, закодированных в формате XML

<?xml version="1.0" encoding="UTF-8"?>

<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- Data Table -->

<format maxRecords="1" minRecords="1"> <!-- Table Format Descriptor -->

       <fields> <!-- Field Set -->

               <field description="Username" name="username" notReplicated="true" readonly="true" type="S"/>

               <field description="First Name" name="firstname" notReplicated="true" nullable="true" type="S"/>

               <field description="Last Name" name="lastname" notReplicated="true" nullable="true" type="S"/>

               <field description="Password" name="password" notReplicated="true" type="S"/>

               <field description="Country" name="country" type="I">

                       <selectionValues>

                               <option description="Albania">1</option>

                               <option description="Algeria">2</option>

                               -- skipped --

                       </selectionValues>

               </field>

               <field description="Region/State/Province/Area" name="region" nullable="true" type="S"/>

               <field description="ZIP Code" name="zip" nullable="true" type="S"/>

               <field description="City" name="city" nullable="true" type="S"/>

               <field description="Address 1" name="address1" nullable="true" type="S"/>

               <field description="Address 2" name="address2" nullable="true" type="S"/>

               <field description="Comments" name="comments" nullable="true" type="S"/>

               <field description="Company" name="company" nullable="true" type="S"/>

               <field description="Department" name="department" nullable="true" type="S"/>

               <field description="E-mail Address" name="email" notReplicated="true" nullable="true" type="S"/>

               <field description="Phone No." name="phone" notReplicated="true" nullable="true" type="S"/>

               <field description="Fax No." name="fax" notReplicated="true" nullable="true" type="S"/>

               <field description="Time Zone" name="timezone" type="S">

                       <selectionValues>

                               <option description="GMT-12:00, Etc/GMT+12">Etc/GMT+12</option>

                               <option description="GMT-11:00, Etc/GMT+11">Etc/GMT+11</option>

                               -- skipped --

                       </selectionValues>

                       <defaultValue>Europe/Moscow</defaultValue>

               </field>

               <field description="Locale" name="locale" type="S">

                       <selectionValues>

                               <option description="Default"/>

                               <option description="aa">aa</option>

                               <option description="ab">ab</option>

                               -- skipped --

                       </selectionValues>

                       <defaultValue>en</defaultValue>

               </field>

               <field description="Date Pattern" name="datepattern" type="S"/>

               <field description="Time Pattern" name="timepattern" type="S"/>

               <field description="Enable Automatic Registration of Device Servers" name="dsautoregistration" type="B"/>

       </fields>

</format>

<records> <!-- Data Table Records -->

       <record> <!-- First Record -->

               <value name="username">ronnie</value>

               <value name="firstname">Ronnie</value>

               <value name="lastname">O'Sullivan</value>

               <value name="password">11111</value>

               <value name="country">218</value>

               <value name="datepattern">dd.MM.yyyy</value>

               <value name="timepattern">HH:mm:ss</value>

               <value name="dsautoregistration">1</value>

       </record>

       <record> <!-- Second Record -->

               <value name="username">john</value>

               <value name="firstname">John</value>

               <value name="lastname">Doe</value>

               <value name="password">12345</value>

               <value name="country">83</value>

               <value name="datepattern">dd.MM.yyyy</value>

               <value name="timepattern">HH:mm:ss</value>

               <value name="dsautoregistration">1</value>

       </record>

</records>

</table>