Поделиться через


Типы данных шаблона массива

Типы данных ARRAY состоят из одного или нескольких значений, которые имеют один и тот же тип данных. Массивы можно определить как фиксированные, переменные или неопределенные длины.

*DataType: ARRAY направляет шаблон для определения составного типа данных, члены которого являются всеми одинаковыми типами данных (также известными как тип данных членов). Элементы типа данных массива будут выводиться как отдельные дочерние XML-элементы, принадлежащие элементу, представляющего вложенный контекст.

Если каждый дочерний элемент представляет примитив типа данных, то тип данных будет определен атрибутом XML xsi:type в каждом элементе. Если атрибут GDL определен как массив данных типа данных, включаемый контекст будет элементом <GDL_ATTRIBUTE>. Имя элемента каждого дочернего xml-элемента будет соответствующим тегом, который определяет директива *ElementTags. Если составной элемент является членом другого составного типа данных, элемент будет создан для представления этого включающего контекста. Имя этого родительского элемента будет соответствующим тегом, назначенным шаблоном, который определил вложенный тип данных.

Для определения типа данных ARRAY используются следующие директивы:

  • *ElementType (обязательно). Имя шаблона, определяющего тип данных всех элементов. Можно указать только один тип данных.

  • *RequiredDelimiter (обязательно). Строка, которая синтаксически отделяет каждый элемент массива от следующего. Два последовательных разделителя будут интерпретированы как опущенный элемент. Разделители не нужны, чтобы указать пропуск конечных элементов. Будьте осторожны, если пробелы используются в качестве разделителя или в составе строки разделителя. Например, лишние символы пространства интерпретируются средством синтаксического анализа, как указывающее пропущенные элементы; и поскольку вы не сможете видеть такие дополнительные символы пробелов, может возникнуть непредвиденная ошибка синтаксического анализа.

    Кроме того, избыточное пробелы обычно лишается исходного файла и пробелы часто добавляются в входной поток в результате препроцессора, макроса и обработки комментариев. Таким образом, фактическая строка, которая анализируется, может иметь совершенно другое количество пробелов, чем первоначально указанное.

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

  • *OptionalDelimiter (необязательно). Любая строка, состоящая из символов, указанных в *OptionalDelimiter, и которая отображается рядом с строкой *RequiredDelimiter, будет считаться частью разделителя. Первый символ, определенный в строке *RequiredDelimiter, не должен отображаться в *OptionalDelimiter.

  • *ElementTags (обязательно). Если вы хотите назначить каждый элемент в массиве одно и то же имя элемента (или если массив может иметь неограниченный размер), укажите только один тег. В противном случае укажите число, равное максимальному значению, которое *ArraySize.

    Каждый элемент массива будет называться соответствующим тегом. Это именование полезно, если один или несколько элементов массива опущены. Если элементы массива опущены, тег, соответствующий опущенным элементу, не используется. Чтобы избежать путаницы с клиентом, не используйте имена зарезервированных элементов моментального снимка GDL (т. е. КОНСТРУКТОР, АТРИБУТ и личность), как имена тегов.

  • *ArraySize (обязательно). Используйте одно целое число, чтобы указать размер массива фиксированного размера или использовать два целых числа, чтобы указать минимальный и максимальный допустимый размер массива переменной размера. Обратите внимание, что для минимального размера допускается ноль, а подстановочный знак GPD (*) можно использовать для указания размера или максимального размера. Укажите пропущенные значения в данных экземпляра с последовательными запятыми (например, *DaysOfWeek: (Sunday, Monday, , Wednesday, , Friday,).

  • *ArrayLabel (необязательно). Если указана эта директива, список элементов массива должен быть заключен в скобки и быть предусловлен меткой *ArrayLabel. Если метка не указана в этой директиве, круглые скобки являются необязательными, и метка префикса не допускается.

Рассмотрим следующий шаблон.

*Template:  RECTANGLE
{
    *Type:  DATATYPE
    *DataType:   ARRAY
    *ElementType:  INTEGER
    *RequiredDelimiter: ","
    *OptionalDelimiter: "<20 09>"
    *ArrayLabel: "rect"
    *ElementTags: (left, top, right, bottom)
    *ArraySize: 4
}

Этот шаблон определяет фиксированный размер массива четырех целых чисел. Массив назначается меткой (rect), а каждый элемент в массиве назначается уникальным тегом элемента. Эти теги помечают каждый элемент в выходных данных XML, чтобы помочь клиенту. Каждый элемент отделяется от следующей запятой или запятой, а также любое сочетание пробелов и символов табуляции. Так как размер массива исправлен, исключение элемента не допускается.

*DataType: шаблоны массива не создают соответствующую схему. Вместо этого используется схема шаблона, именованного в директиве *ElementType.

Рассмотрим следующую запись GDL.

*ImageableArea:   rect( - 10, 20 , +30, 0x40  )  

И рассмотрим шаблон IMAGERECT.

*Template:  IMAGERECT
{
    *Name:  "*ImageableArea"
    *Type:  ATTRIBUTE
    *ValueType:  RECTANGLE
}

Если запись GDL интерпретируется шаблоном IMAGERECT, результирующий xml-результат будет.

<GDL_ATTRIBUTE Name="*ImageableArea"  >
<left  xsi:type="GDLW_int">-10</left>
   <top  xsi:type="GDLW_int">20</top>
   <right  xsi:type="GDLW_int">30</right>
   <bottom  xsi:type="GDLW_int">64</bottom>
</GDL_ATTRIBUTE> 

Обратите внимание, что ссылка заключается в GDLW_int упаковаемого типа, а не исходного int.