Типы данных шаблонов нескольких личностей
Тип данных MULTIPLE_PERSONALITY представляет значение, которое может содержать разные типы данных в разное время. Этот тип данных аналогичен типу данных объединения языка C.
*DataType: MULTIPLE_PERSONALITY направляет шаблон для определения типа данных, который может принимать значения, принадлежащие нескольким разным типам данных, как тип данных объединения языка C. Тип данных MULTIPLE_PERSONALITY пытается определить удостоверение (т. е. тип данных) значения и выводит тот же XML-код, что и если бы значение было явно определено в шаблоне для принадлежности к определенному типу данных. Другими словами, если тип данных MULTIPLE_PERSONALITY был определен для хранения строки или целого числа или SYMBOL, а значение фактически содержало целое число, выходные данные XML будут иметь значение для целочисленного типа данных.
Атрибут тега личности также создается, чтобы помочь клиентам определить тип данных выданного значения. Фильтр определяет тип данных значения путем анализа значения с использованием каждого потенциального типа данных. Выбирается тип данных, который успешно соответствует наибольшему объему входного значения. В случае привязки выбирается тип элемента, который отображается первым в списке.
Примечание Вы можете создавать синтаксисы значений, которые могут обмануть этот алгоритм оценки, поэтому будьте осторожны при выборе типов элементов для перечисления. Типы должны быть достаточно различимы алгоритмом синтаксического анализа. Например, так как фильтр синтаксического анализа не распознает синтаксис XML, он не может различать два типа данных XML_TYPE. Однако в этих случаях определение потенциальных типов данных может включать директиву *ArrayLabel, которая поможет средству синтаксического анализа различать их.
Для определения типа данных MULTIPLE_PERSONALITY используются следующие директивы:
*ElementType (обязательный). Список имен шаблонов, определяющих потенциальные типы данных, которые может предполагать это значение.
*ElementTags (обязательно). Список тегов, которые помогут клиенту определить тип данных, который фактически присваивается значению. Количество предоставленных тегов должно совпадать с количеством шаблонов, перечисленных в *ElementType. Тег будет отображаться в атрибуте личности в созданном XML-элементе, который представляет значение. Например, если тип данных является массивом нескольких типов данных личности, элементы, представляющие отдельные члены массива, будут содержать атрибут личности. Элемент, представляющий весь массив, не будет содержать атрибут личности, так как сам массив не имеет определенной личности; Вместо этого отдельные члены массива имеют собственное значение атрибута личности.
Рассмотрим следующий шаблон.
*Template: INT_OR_QUALNAME_EX
{
*Type: DATATYPE
*DataType: MULTIPLE_PERSONALITY
*ElementType: (INTEGER, QUALNAME_EX, QUOTEDSTRING)
*ElementTags: (integer, QualNameEx, QuotedString)
}
Этот шаблон определяет тип данных, который может содержать значение INTEGER, QUALNAME_EX значение или значение QUOTEDSTRING. Любой выбранный тип данных будет идентифицироваться с помощью соответствующего определяемого пользователем элемента ElementTag.
Рассмотрим следующие записи GDL.
*rcNameID: ( RESDLL.stdname.467 )
*rcNameID: (0x117 )
И рассмотрим следующий шаблон RC_NAME_ID2.
*Template: RC_NAME_ID2
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: INT_OR_QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
Если записи GDL интерпретируются предыдущим шаблоном, выходные данные XML будут следующими.
<GDL_ATTRIBUTE Name="*rcNameID" Personality="QualNameEx" >
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</GDL_ATTRIBUTE>
<GDL_ATTRIBUTE Name="*rcNameID" Personality="integer"
xsi:type="GDLW_int" >279</GDL_ATTRIBUTE>
Единственное различие между выходными данными XML, созданными из типа MULTIPLE_PERSONALITY, и фактическим типом является дополнительный атрибут тега личности, который добавляется для информирования клиента о фактическом типе данных значения.
Например, можно создать массив, в котором каждый член массива является типом MULTIPLE_PERSONALITY, как показано ниже.
*Template: DT_ARRAY_OF_MP
{
*Type: DATATYPE
*DataType: ARRAY
*ElementType: INT_OR_QUALNAME_EX
*RequiredDelimiter: ","
*OptionalDelimiter: "<20 09>"
*ElementTags: (ArrayMember)
*ArraySize: *
}
*Template: ARRAY_OF_MP
{
*Name: "*rcNameID_List"
*Type: ATTRIBUTE
*ValueType: DT_ARRAY_OF_MP
}
Вы также можете использовать предыдущий шаблон для обработки данных следующего экземпляра, который представляет собой массив, содержащий три объекта-личности, каждый из которых имеет разную личность.
*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )
Эта обработка приведет к получению следующего XML-snapshot.
<GDL_ATTRIBUTE Name="*rcNameID_List" >
<ArrayMember Personality="QualNameEx">
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</ArrayMember>
<ArrayMember Personality="integer" xsi:type="GDLW_int">279</ArrayMember>
<ArrayMember Personality="QuotedString" xsi:type="GDLW_string">Quote</ArrayMember>
</GDL_ATTRIBUTE>
Как показывает snapshot, средство синтаксического анализа определило правильную личность для каждого из трех элементов массива и установило атрибут личности в элементе каждого элемента, чтобы указать соответствующую личность.